【问题标题】:gdb stops in a command file if there is an error. How to continue despite the error?如果出现错误,gdb 会在命令文件中停止。尽管出现错误,如何继续?
【发布时间】:2013-07-29 05:35:19
【问题描述】:

我在分析核心文件时我的真正 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"

【问题讨论】:

    标签: linux gdb coredump


    【解决方案1】:

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

    不过,如果您的 gdb 是使用 Python 扩展构建的,那么这很容易做到。搜索“忽略错误”脚本。有了它,您可以:

    (gdb) 忽略错误打印 *foo

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

    【讨论】:

    • 感谢您的建议。我没有设法使用ignore-errors,因为我得到了Undefined command: "ignore-errors",但我创建了一个类似的命令并且我工作了。
    • 是的,您必须搜索它。 sourceware.org/ml/gdb/2010-06/msg00100.html
    • 让我解释一下。在我服务器上的 gdb 中有 ignore-errors.py 但我还不知道如何使用它。简单地输入ignore-errors print p 不起作用。尽管如此,我还是利用了 ignore-errors.py 中的想法并创建了自己的my_ignore_errors。你可以在我更新的问题中看到它。
    • 您可以只使用“source ignore-errors.py”。这将注册“忽略错误”命令。
    【解决方案2】:

    您也可以这样做:

    gdb a.out < analyze.v2.gdb 
    

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

    【讨论】:

      【解决方案3】:

      如果只是想在出现错误时退出,可以使用-batch gdb option

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 2021-12-22
        相关资源
        最近更新 更多