GDB - Как сломать "что-то написано в cout"?

Я хотел бы установить точку останова, которая запускается каждый раз, когда что-то записывается в stdout через поток cout, но мне трудно найти возможную позицию для этой точки останова.

Как это сделать в gdb?

Ответ 1

Это зависит от платформы. Если вы находитесь на 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_

Ответ 2

просто используйте rbreak следующим образом:

gdb> rbreak std::ostream::operator<<

вы можете написать каждое регулярное выражение, соответствующее вашему имени функции. Это самый простой способ поймать все экземпляры шаблонов, например. Если регулярное выражение, которое я написал в примере, недостаточно сильное, не стесняйтесь писать более специализированный. Надеюсь, что я мог бы дать начальную точку.