Я хотел бы установить точку останова, которая запускается каждый раз, когда что-то записывается в stdout
через поток cout
, но мне трудно найти возможную позицию для этой точки останова.
Как это сделать в gdb?
Я хотел бы установить точку останова, которая запускается каждый раз, когда что-то записывается в stdout
через поток cout
, но мне трудно найти возможную позицию для этой точки останова.
Как это сделать в gdb?
Это зависит от платформы. Если вы находитесь на x86_64, а создание с gcc-записью в std:: cout приводит к вызову fwrite
. Backtrace выглядит следующим образом:
#0 0x0000003c2fc622a0 in fwrite () from /lib64/libc.so.6
#1 0x0000003c43289655 in std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const () from /usr/lib64/libstdc++.so.6
#2 0x0000003c432898c7 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const () from /usr/lib64/libstdc++.so.6
#3 0x0000003c43291e5c in std::basic_ostream<char, std::char_traits<char> >::operator<<(int) () from /usr/lib64/libstdc++.so.6
Итак, это возможный способ разрыва записи в std:: cout (std:: cout http://refspecs.linuxfoundation.org/LSB_1.1.0/gLSB/baselib--io-2-1-stdout--.html):
b fwrite if $rcx==&_IO_2_1_stdout_
И это способ сломать запись в std:: cerr (std:: cerr http://refspecs.linuxfoundation.org/LSB_1.0.0/gLSB/baselib--io-2-1-stderr--.html):
b fwrite if $rcx==&_IO_2_1_stderr_
просто используйте rbreak следующим образом:
gdb> rbreak std::ostream::operator<<
вы можете написать каждое регулярное выражение, соответствующее вашему имени функции. Это самый простой способ поймать все экземпляры шаблонов, например. Если регулярное выражение, которое я написал в примере, недостаточно сильное, не стесняйтесь писать более специализированный. Надеюсь, что я мог бы дать начальную точку.