gdb - 如何查看stdout使用的函数?

时间:2013-02-18 16:27:00

标签: c++ gdb

我有一个我正在尝试跟踪的OpenGL库错误,并且该错误会将类似C代码的内容打印到stdout中。 This is the program,一旦glutMainLoop()被调用就会发生错误,但我怀疑这不是那个错误的函数。我如何追踪写入stdout的函数?

根据要求,输出:

arc_ccw_turn, p = 0
case b
arc_ccw_turn, p = 0
case d
arc_ccw_turn, p = 0
case a
arc_ccw_turn, p = 0
case c

reported the bug already,但我也尝试为此问题提供GDB回溯。

2 个答案:

答案 0 :(得分:6)

如果您使用的是Linux,则在write()上设置断点,所有输出到stdoutstderr最终都会通过此功能。以下内容适用于x86-64,对于您需要更改寄存器名称的其他架构:

$ gdb /usr/bin/cat
Reading symbols from /usr/bin/cat...(no debugging symbols found)...done.
(gdb) set args /proc/cpuinfo
(gdb) b write
Breakpoint 1 at 0x401740
(gdb) condition 1 ($rdi == 1 || $rdi == 2)
(gdb) display $rdi
(gdb) display $rsi
(gdb) display $rdx
(gdb) r
Starting program: /usr/bin/cat /proc/cpuinfo
3: $rdx = 3368
2: $rsi = 6348800
1: $rdi = 1
(gdb) p (char*)$rsi
$4 = 0x60e000 "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 30\nmodel name\t: Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz\nstepping\t: 5\nmicrocode\t: 0x5\ncpu MHz\t\t: 1199.000\ncache size\t: 8192 KB\nphy"...

答案 1 :(得分:1)

std::streambuf::sputcstd::streambuf::sputn上放置断点。如果有必要,请在print std::cin::rdbuf()后执行main,并将this上的断点设置为等于使用从此表达式返回的值。