这是一种依赖于平台的方式.如果您使用的是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)
只需使用rbreak如下:
gdb> rbreak std::ostream::operator<<
Run Code Online (Sandbox Code Playgroud)
你可以编写与你的函数名匹配的每个正则表达式.例如,这是捕获所有模板实例的最简单方法.如果我在示例中编写的正则表达式不够强大,请随意编写更专业的正则表达式.我希望我能提供一个起点.