web-dev-qa-db-ja.com

Linux上のgdbに対してプログラムでCまたはC ++コードにブレークポイントを設定する

Linuxのgdbで機能するCまたはC++コードにプログラムでブレークポイントを設定するにはどうすればよいですか?

つまり:

int main(int argc, char** argv)
{
    /* set breakpoint here! */
    int a = 3;
    a++;  /*  In gdb> print a;  expect result to be 3 */
    return 0;
}
87
J. Polfer

1つの方法は、割り込みを通知することです。

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);

Cで:

#include <signal.h>
raise(SIGINT);

[〜#〜] update [〜#〜]MSDN状態 WindowsはSIGINT。したがって、移植性が懸念される場合は、おそらくSIGABRTを使用することをお勧めします。

88
Håvard S

私が取り組んでいるプロジェクトでは、次のことを行います。

raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */

(この場合、デバッガの外部でこれが発生した場合、ハードクラッシュし、可能であればクラッシュレポートを生成したかったのです。それがSIGABRTを使用した理由の1つです。 #ifdefs、役立つコメントがあります: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 。)

25
Jason Orendorff

here を見ると、次の方法が見つかりました。

void main(int argc, char** argv)
{
    asm("int $3");
    int a = 3;
    a++;  //  In gdb> print a;  expect result to be 3
}

これは私にとってはちょっとハックのようです。そして、これはx86アーキテクチャでのみ機能すると思います。

21
J. Polfer

__asm__("int $3");は動作するはずです:

int main(int argc, char** argv)
{
    /* set breakpoint here! */
    int a = 3;
    __asm__("int $3");
    a++;  /*  In gdb> print a;  expect result to be 3 */
    return 0;
}
10
hek2mgl

OS Xでは、std::abort()を呼び出すことができます(Linuxでも同じかもしれません)

1
dacap