2

スタック、または関数の呼び出し方法を誤解しているに違いありません。GDB から取得したバックトレースの結果は意味がありません。コンポーネントを追加できるように、プログラム内で呼び出される場所を見つけようとしています。

このツールは動画にバウンディング ボックスを描画します。私が作成したのはインターポレーターです。ボックスが描画されているときに GDB を開いてブレークポイントを設定し、バックトレースを実行することだけが理にかなっていると思いました。これがmuの出力です(からプログラムを実行した後ffmpeg.c main()

#0  draw_glyphs (vidatbox=0x10183d200, picref=0x10141e340, width=720, height=480,
rgbcolor=0x10183d284 "????", yuvcolor=0x10183d278 "뀀?\020???\020???????", x=0, y=0) at 
libavfilter/vf_VidAT.c:627
#1  0x000000010001ce4c in draw_text (ctx=0x10120df20, picref=0x10141e340, width=720, 
height=480) at libavfilter/vf_VidAT.c:787

すべての非ASCII文字を無視して、2つの関数はどのようdraw_glyphsdraw_text呼び出されていますか? スタックに他に何もないのはなぜですか?Frame #1 を選択して try and go を実行すると、次のようupに表示されます。

Initial frame selected; you cannot go up.

編集:

私はもっ​​と調べましたが、尋ねたときよりもさらに混乱しています。関数draw_glyphsは、私が実行しているメインの内部でも呼び出されません。これがコンパイルに使用するすべてのファイルを調べましたが、まあ...どこにも呼び出されていません!

これは動的に作成された関数ポインタか何かということですか? もしそうなら、それは私のようにスタックにアクセスできないようにしますか?

4

1 に答える 1

3

スタック トレースが参考になるが、(特に 1 つまたは 2 つのエントリの後で) 予期せず終了する場合は、gdb がその時点を過ぎてコール スタックをたどることができなかったことを示します。

スタックの巻き戻しを妨げるコンパイラ オプションには、より高い最適化レベル (特に-O3) と-fomit-frame-pointerが含まれているため、Makefile を検索してそれらのオプションを削除します。通常、フレーム ポインターはコードの実行には必要ないため、これを汎用レジスターとして使用すると、x86 などのレジスター不足のアーキテクチャでパフォーマンスが向上しますが、デバッグに干渉する可能性があります。

最近では、フレームベースのスタックの巻き戻しは巻き戻しテーブルに置き換えられていますが、巻き戻しテーブルが存在しない場合、gdb は依然としてフレーム ポインターに依存しています。

于 2012-06-20T09:20:10.497 に答える