GDB - 如何突破"某事写入cout"?

Ben*_*nno 14 c++ gdb

我想设置一个断点,每次stdout通过cout流写入某些东西时触发,但是我很难找到这个断点的可能位置.

我怎么能在gdb中这样做?

Ser*_*kov 9

这是一种依赖于平台的方式.如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

所以这是写入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_
Run Code Online (Sandbox Code Playgroud)

这是打破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_
Run Code Online (Sandbox Code Playgroud)


Kla*_*aus 7

只需使用rbreak如下:

gdb> rbreak std::ostream::operator<<
Run Code Online (Sandbox Code Playgroud)

你可以编写与你的函数名匹配的每个正则表达式.例如,这是捕获所有模板实例的最简单方法.如果我在示例中编写的正则表达式不够强大,请随意编写更专业的正则表达式.我希望我能提供一个起点.