Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有用户输入的gdb回溯?_C++_Linux_Bash_Gdb - Fatal编程技术网

C++ 没有用户输入的gdb回溯?

C++ 没有用户输入的gdb回溯?,c++,linux,bash,gdb,C++,Linux,Bash,Gdb,我想知道是否有可能通过GDB启动一个应用程序,在SegFault上将回溯写入一个文件(稍后查看),然后在没有任何用户输入的情况下退出GDB all 我在从非交互式会话引导操作系统时,通过无限循环中的shell脚本运行应用程序(因此,如果它崩溃,它将重新加载)。应用程序正在以不可复制的方式崩溃,因此我需要从崩溃中进行回溯以调试问题。理想情况下,我只需修改shell脚本,以包含GDB调试+回溯功能,并保留崩溃后应用程序的自动重启 这可能吗?多亏了阿迪蒂亚·库马尔;可接受的解决方案: gdb-batc

我想知道是否有可能通过GDB启动一个应用程序,在SegFault上将回溯写入一个文件(稍后查看),然后在没有任何用户输入的情况下退出GDB all

我在从非交互式会话引导操作系统时,通过无限循环中的shell脚本运行应用程序(因此,如果它崩溃,它将重新加载)。应用程序正在以不可复制的方式崩溃,因此我需要从崩溃中进行回溯以调试问题。理想情况下,我只需修改shell脚本,以包含GDB调试+回溯功能,并保留崩溃后应用程序的自动重启


这可能吗?

多亏了阿迪蒂亚·库马尔;可接受的解决方案:


gdb-batch-ex“run”-ex“bt”${my_program}2>&1 | grep-v^“无堆栈”。$

这适用于gdb 7.6:

如果给定命令行参数,则会导致堆芯转储的测试程序:

int a(int argc)
{
  if (argc > 1) {
    int *p = 0;
    *p = *p +1;
    return  *p;
  }
  else {
    return 0;
  }
}

int b(int argc)
{
  return a(argc);
}

int main(int argc, char *argv[])
{
  int res = b(argc);
  return res;
}
>gdb -q -x my_check.py --args ./a.out 1 >/dev/null
我的python脚本My_check.py:

def my_signal_handler (event):
  if (isinstance(event, gdb.SignalEvent)):
    log_file_name = "a.out.crash." + str(gdb.selected_inferior().pid) + ".log"
    gdb.execute("set logging file " + log_file_name )
    gdb.execute("set logging on")
    gdb.execute("set logging redirect on")
    gdb.execute("thread apply all bt")
    gdb.execute("q")

gdb.events.stop.connect(my_signal_handler)
gdb.execute("set confirm off")
gdb.execute("set pagination off")
gdb.execute("r")
gdb.execute("q")
所以,首先我运行了a,没有崩溃。未创建任何日志文件:

gdb-q-x my_check.py--args./a.out>/dev/null

接下来我运行a.out并给它一个参数:

int a(int argc)
{
  if (argc > 1) {
    int *p = 0;
    *p = *p +1;
    return  *p;
  }
  else {
    return 0;
  }
}

int b(int argc)
{
  return a(argc);
}

int main(int argc, char *argv[])
{
  int res = b(argc);
  return res;
}
>gdb -q -x my_check.py --args ./a.out 1 >/dev/null
这是一份事故报告:

>cat a.out.crash.13554.log

Thread 1 (process 13554):
#0  0x0000000000400555 in a (argc=2) at main.cpp:5
#1  0x000000000040058a in b (argc=2) at main.cpp:15
#2  0x00000000004005a3 in main (argc=2, argv=0x7fffffffe198) at main.cpp:20

除了存储回溯,您还可以在shell脚本的无限循环前面放置
ulimit-c unlimited
。结果是,每次程序发生故障时,它都会将一个内核转储写入一个文件,在我的系统上该文件名为
core
,但在其他系统上可能包含进程id。如果程序发生故障(从退出状态看,它等于139)然后只需使用唯一的名称(例如使用时间戳)将
核心
文件移动到安全位置。有了这些核心文件和gdb,您就可以做更多的事情,而不仅仅是查看回溯。因此,我想使用它们可能对您更有用。

gdb--batch-q-exbt

您不能在系统上启用核心文件并以这种方式获得回溯吗?这似乎比gdb循环容易得多。
因此我需要从崩溃中进行回溯以调试问题。
-我还没有找到一个答案,为什么不能从崩溃中分析核心文件?是因为它很大吗?如果
${my_program}
接受参数,您可能需要在
${my_program}
之前添加
--args