簡體   English   中英

在 C 或 C++ 代碼中以編程方式為 Linux 上的 gdb 設置斷點

[英]Set breakpoint in C or C++ code programmatically for gdb on Linux

如何以編程方式在 C 或 C++ 代碼中設置適用於 Linux 上的 gdb 的斷點?

IE:

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

一種方法是發出中斷信號:

#include <csignal>

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

在 C 中:

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

更新Microsoft Docs表示 Windows 並不真正支持SIGINT ,因此如果擔心可移植性,您最好使用SIGABRT

任何 Win32 應用程序都不支持 SIGINT。 當發生 CTRL+C 中斷時,Win32 操作系統會生成一個新線程來專門處理該中斷。 這可能導致單線程應用程序(例如 UNIX 中的應用程序)變為多線程並導致意外行為。

通過查看here ,我找到了以下方法:

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

這對我來說似乎有點駭人聽聞。 而且我認為這只適用於 x86 架構。

在我從事的一個項目中,我們這樣做:

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

(在我們的例子中,如果這發生在調試器之外,我們希望嚴重崩潰,並盡可能生成崩潰報告。這就是我們使用 SIGABRT 的原因之一。在 Windows、Mac 和 Linux 上進行此操作需要多次嘗試。我們最終得到了一些#ifdefs,在這里有用的評論:http: //hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 。)

看到這么多沒有使用軟件斷點專用信號SIGTRAP的答案令人失望:

#include <signal.h>

raise(SIGTRAP); // At the location of the BP.

在 MSVC/MinGW 上,您應該使用DebugBreak__debugbreak內在函數。 一個簡單的#ifdef可以處理這兩種情況(POSIX 和 Win32)。

__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;
}

在 OS X 上,您可以調用std::abort() (在 Linux 上可能相同)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM