我想设置一个断点,每次通过stdout
流将某些内容写入cout
时触发该断点,但我找不到此断点的可能位置。
如何在gdb中执行此操作?
答案 0 :(得分:6)
只需按如下方式使用rbreak:
gdb> rbreak std::ostream::operator<<
您可以编写与您的函数名称匹配的每个正则表达式。例如,这是捕获所有模板实例的最简单方法。如果我在示例中编写的正则表达式不够强大,请随意编写更专业的正则表达式。我希望我能提供一个起点。
答案 1 :(得分:6)
这是一种依赖于平台的方式。如果您使用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_