GDB - 如何打破"某些东西被写入cout"?

时间:2014-05-20 11:01:17

标签: c++ gdb

我想设置一个断点,每次通过stdout流将某些内容写入cout时触发该断点,但我找不到此断点的可能位置。

如何在gdb中执行此操作?

2 个答案:

答案 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_