如果出现错误,gdb将在命令文件中停止。尽管有错误但如何继续?

时间:2013-07-29 12:20:23

标签: linux gdb coredump

我在分析核心文件时的真实gdb脚本我尝试取消引用指针并获取“源文件命令文件中的错误:无法访问内存中的内存”然后我的gdb脚本停止。我想要的只是继续执行我的gdb脚本而不停止。有可能吗?

这是一个测试程序和测试gdb脚本,用于演示我的问题。在这种情况下,指针具有NULL值,但在实际情况下,指针将不具有null无效值。

这是测试C程序:

#include <stdio.h>
struct my_struct {
  int v1;
  int v2;
};

int main()
{
  my_struct *p;
  printf("%d %d\n", p->v1, p->v2);
  return 0;
}

这是一个测试gdb脚本:

>cat analyze.gdb
p p->v1
q

这是问题的证明(我想从gdb得到的是获取此错误消息,然后进入进程quit命令):

>gdb -silent a.out ./core.22384 -x ./analyze.gdb
Reading symbols from /a.out...done.
[New Thread 22384]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400598 in main () at main.cpp:11
11        printf("%d %d\n", p->v1, p->v2);
./analyze.gdb:1: Error in sourced command file:
Cannot access memory at address 0x0
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.x86_64

<小时/> 的更新
谢谢汤姆。这是一个处理此问题的gdb脚本:

>cat ./analyze.v2.gdb
python
def my_ignore_errors(arg):
  try:
    gdb.execute("print \"" + "Executing command: " + arg + "\"")
    gdb.execute (arg)
  except:
    gdb.execute("print \"" + "ERROR: " + arg + "\"")
    pass

my_ignore_errors("p p")
my_ignore_errors("p p->v1")
gdb.execute("quit")

这是它的工作原理:

>gdb -silent ./a.out -x ./analyze.v2.gdb -c ./core.15045
Reading symbols from /import/home/a.out...done.
[New Thread 15045]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400598 in main () at main.cpp:11
11        printf("%d %d\n", p->v1, p->v2);
$1 = "Executing command: p p"
$2 = (my_struct *) 0x0
$3 = "Executing command: p p->v1"
$4 = "ERROR: p p->v1"
$5 = "Executing command: quit"

3 个答案:

答案 0 :(得分:6)

gdb的命令语言无法在处理命令时忽略错误。

但是,如果您的gdb是使用Python扩展构建的,那么这很容易完成。搜索“ignore-errors”脚本。有了它,你可以:

(gdb)ignore-errors print * foo

...并且将显示打印中的任何错误,但不会中止脚本的其余部分。

答案 1 :(得分:1)

你也可以这样做:

gdb a.out < analyze.v2.gdb 

这将逐行执行analyze.v2.gdb中的命令,即使发生错误。

答案 2 :(得分:-1)

如果您只想在发生错误时退出,可以使用-batch gdb option

  

以批处理模式运行。处理完所有命令后退出状态为0   用'-x'指定的文件(以及初始化文件中的所有命令,   如果没有用“-n”禁止。如果出错,则退出非零状态   在执行命令文件中的GDB命令时发生。 [...]