如何以编程方式在C或C++代码中设置断点,这对于Linux上的gdb有效?
即:
int main(int argc, char** argv)
{
/* set breakpoint here! */
int a = 3;
a++; /* In gdb> print a; expect result to be 3 */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Håv*_*d S 93
一种方法是发出中断信号:
#include <csignal>
// Generate an interrupt
std::raise(SIGINT);
Run Code Online (Sandbox Code Playgroud)
在C:
#include <signal.h>
raise(SIGINT);
Run Code Online (Sandbox Code Playgroud)
更新:MSDN声明 Windows并不真正支持SIGINT,所以如果可移植性是一个问题,你可能最好不要使用SIGABRT.
Jas*_*rff 26
在我工作的项目中,我们这样做:
raise(SIGABRT); /* To continue from here in GDB: "signal 0". */
Run Code Online (Sandbox Code Playgroud)
(在我们的例子中,如果这发生在调试器外部,我们想要崩溃,如果可能的话会生成崩溃报告.这就是我们使用SIGABRT的一个原因.在Windows,Mac和Linux上进行多次尝试.我们最终得到了一些. #ifdefs,在这里有帮助评论:http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66.)
J. *_*fer 22
通过这里看,我发现了以下方式:
void main(int argc, char** argv)
{
asm("int $3");
int a = 3;
a++; // In gdb> print a; expect result to be 3
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是一种触动.我认为这只适用于x86架构.
Ben*_*Tut 16
令人失望的是,看到这么多答案没有使用软件断点的专用信号,SIGTRAP:
#include <signal.h>
raise(SIGTRAP); // At the location of the BP.
Run Code Online (Sandbox Code Playgroud)
在 MSVC/MinGW 上,您应该使用DebugBreak, 或__debugbreak内在的。一个简单的#ifdef可以处理这两种情况(POSIX 和 Win32)。
hek*_*mgl 10
__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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70654 次 |
| 最近记录: |