2

gdb関数 (サード パーティのライブラリ) へのポインターを渡すまではすべて問題なく動作する C プログラムをデバッグするために使用しようとしてgdbいます。

たとえば、コールバック関数へのポインタを期待するライブラリpcap_loopから呼び出しています。libpcapgot_packet

 pcap_loop(handle, num_packets, got_packet, NULL);

gdbブレークポイントでこのラインに足を踏み入れたり、越えたりするとすぐに、got_packetヒットすることはありません。
なんで ?
何か案は?

4

1 に答える 1

1

特に最適化を有効にしてコンパイルされたコードをデバッグする場合、GDB ブレークポイントがスキップされる状況がいくつかありますが、最も可能性の高い答えは、ライブラリ関数が期待どおりに動作していないことです。

GDBはデバッグ情報を持たないライブラリにステップインできないため、代わりに「フォーカスを失った」ように見え、リターンポイントに一時的なブレークポイントを設定し、関数が終了するのを待ちます。それでも、コールバック内のブレークポイントがトリガーされるのを止めるべきではありません。

OS リポジトリから取得したライブラリを使用している場合は、インストールできる「デバッグ」パッケージがあることに気付くかもしれません。これにより、ライブラリコードにステップインして、問題の原因を突き止めることができます。

ただし、通常は、printfデバッグを追加するgot_packetか、シグナル ( ) を発生させる何らかの方法で関数を「中断」し、*(int *)0 = 1呼び出されているかどうかにかかわらず、その方法で満足する方がはるかに簡単です。

関数が実際に呼び出され、GDB が実際にブレークポイントをキャッチしていないことを示すことができれば、GDB のバグ (またはカーネルのバグ) があります。

于 2013-02-18T17:00:54.177 に答える