1

トレースしようとしている OpenGL ライブラリのバグがあり、バグは C コードのように見えるものを stdout に出力します。これはプログラムであり、呼び出されるとすぐにバグが発生しますが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

私はすでにバグを報告しましたが、問題の GDB バックトレースも提供しようと思います。

4

2 に答える 2

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"...
于 2013-02-18T17:37:42.067 に答える
1

std::streambuf::sputcとにブレークポイントを設定しstd::streambuf::sputnます。必要に応じて、 に入ったら実行print std::cin::rdbuf()main、ブレーク ポイントthisが値と等しいことを条件として、この式から get back を使用します。

于 2013-02-18T16:31:32.670 に答える