我有一个我正在尝试跟踪的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回溯。
答案 0 :(得分:6)
如果您使用的是Linux,则在write()
上设置断点,所有输出到stdout
和stderr
最终都会通过此功能。以下内容适用于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::sputc
和std::streambuf::sputn
上放置断点。如果有必要,请在print std::cin::rdbuf()
后执行main
,并将this
上的断点设置为等于使用从此表达式返回的值。