2

Android NDK プログラムで C++ から GDB ブレークをトリガーして、後でプログラムを再開できるようにすることは可能ですか?

つまり、GDB がプログラムを停止する原因となるアサートをヒットし、Eclipse の [再生] ボタンを押してプログラムを再開し、アサートを超えて続行できるようにしたいと考えています。

現在、私は使用しています:

__asm__ ("bkpt 0");

これにより、プログラムが停止し、プログラムをトリガーしたコード行に移動しますが、その後再開することはできません。

GDB はプログラム停止時に以下を出力します。

(gdb) 
82 info signal SIGBUS
&"info signal SIGBUS\n"
~"Signal        Stop\tPrint\tPass to program\tDescription\n"
~"SIGBUS        Yes\tYes\tYes\t\tBus error\n"
82^done
(gdb) 

この時点で「再開」を押すと、LogCat に次の出力が表示されます。

Fatal signal 11 (SIGSEGV) at 0xfffffffd (code=1)

おそらく私の質問は、致命的ではない休憩を投げる方法ですか?

4

1 に答える 1

2

プロセスがデバッグされているかどうかを検出するLinuxの標準的な方法は次のとおりです。

if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1)
    //Yes, we're running under GDB

そのことを念頭に置いて、bkpt 0デバッガーの下でのみ起動する条件付きハードブレークポイント()を実行します。

AndroidでのJavaのみのデバッグがptraceに影響するかどうかはわかりません。試してみる。

編集:raise(SIGABRT)ブレークするために呼び出します。次に、GDBで「signal 0続行する」と入力します。SIGINTやSIGTRAPなどの他のシグナルも機能する可能性があります。

于 2012-10-24T03:01:43.520 に答える