gpt4 book ai didi

c++ - 是否可以在异常(段错误)错误后自动重启 GDB 中的程序?

转载 作者:太空狗 更新时间:2023-10-29 21:00:17 30 4
gpt4 key购买 nike

我如何使用 GDB 在 C++ 中运行程序,以便在出现错误异常(段错误)时重新启动程序(我希望 GDB 自动使用“运行”命令),同时将任何错误记录到文件中(命令“哪里”)。

有可能吗?

最佳答案

让我向您展示一个示例,在程序崩溃时重新启动程序 3 次。我使用 python 脚本来处理 SIGSEGV ( https://sourceware.org/gdb/onlinedocs/gdb/Events-In-Python.html )。

首先,这是一个 GDB session 的例子:

>gdb -q -x restart.py ./a.out
Reading symbols from /home/a.out...done.
process id: 1700

Program received signal SIGSEGV, Segmentation fault.
0x000000000040060e in c () at main2.cpp:9
9 *ptr = *ptr +1;
#0 0x000000000040060e in c () at main2.cpp:9
#1 0x000000000040062a in main () at main2.cpp:15
process id: 1704

Program received signal SIGSEGV, Segmentation fault.
0x000000000040060e in c () at main2.cpp:9
9 *ptr = *ptr +1;
#0 0x000000000040060e in c () at main2.cpp:9
#1 0x000000000040062a in main () at main2.cpp:15
process id: 1705

Program received signal SIGSEGV, Segmentation fault.
0x000000000040060e in c () at main2.cpp:9
9 *ptr = *ptr +1;
#0 0x000000000040060e in c () at main2.cpp:9
#1 0x000000000040062a in main () at main2.cpp:15
process id: 1706

Program received signal SIGSEGV, Segmentation fault.
0x000000000040060e in c () at main2.cpp:9
9 *ptr = *ptr +1;
#0 0x000000000040060e in c () at main2.cpp:9
#1 0x000000000040062a in main () at main2.cpp:15
(gdb)

每次崩溃都会创建一个名为 crash.file.PID 的文件。这是一个文件示例:

>more crash.file.1860
#0 0x000000000040060e in c () at main2.cpp:9
#1 0x000000000040062a in main () at main2.cpp:15

这是一个 C++ 程序:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int c()
{
printf("process id: %d\n", getpid());
int *ptr =0;
*ptr = *ptr +1;
return *ptr;
}

int main()
{
c();
return 0;
}

这是一个 python 脚本:

>cat restart.py
#!gdb
import sys
import gdb
import os

number_restarts = 3

def on_stop(sig):
global number_restarts
if isinstance(sig, gdb.SignalEvent) and sig.stop_signal == "SIGSEGV":
crash_file = "crash.file." + str( gdb.selected_inferior().pid)
gdb.execute("set logging file " + crash_file)
gdb.execute("set logging on")
gdb.execute("where")
gdb.execute("set logging off")
if (number_restarts > 0):
number_restarts -= 1
gdb.execute("set confirm off")
gdb.execute("kill")
gdb.execute("run")


gdb.events.stop.connect (on_stop)
gdb.execute("set pagination off")
gdb.execute("run")

关于c++ - 是否可以在异常(段错误)错误后自动重启 GDB 中的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22370928/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com