我的程序是这样运行的:

exe -p param1 -i param2 -o param3

它崩溃并生成了一个核心转储文件core.pid.

我想通过

gdb ./exe -p param1 -i param2 -o param3 core.pid

但GDB将EXE文件的参数识别为GDB的输入.

在这种情况下,如何分析核心转储文件?

推荐答案

可以通过多种方式将core与GDB一起使用,但将要传递给可执行文件的参数传递给GDB并不是使用core文件的方式.这也可能是你出错的原因.您可以通过以下方式使用核心文件:

gdb <executable> <core-file>gdb <executable> -c <core-file>

gdb <executable>
...
(gdb) core <core-file>

使用核心文件时,不必传递参数.崩溃场景显示在GDB中(使用Ubuntu上的GDB 7.1版进行判断).

例如:

$ ./crash -p param1 -o param2
Segmentation fault (core dumped)
$ gdb ./crash core
GNU gdb (GDB) 7.1-ubuntu
...
Core was generated by `./crash -p param1 -o param2'. <<<<< See this line shows crash scenario
Program terminated with signal 11, Segmentation fault.
#0  __strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
(gdb)

如果要将参数传递给要在GDB中调试的可执行文件,请使用--args.

例如:

$ gdb --args ./crash -p param1 -o param2
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) r
Starting program: /home/@@@@/crash -p param1 -o param2

Program received signal SIGSEGV, Segmentation fault.
__strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
(gdb)

手册页将有助于查看其他GDB选项.

最有用的命令是:

  • bt(回溯)
  • info locals(显示局部变量的值)
  • info registers(显示CPU寄存器的值)
  • frame X(更改为堆栈帧X)
  • updown(在堆栈框架(调用链)中导航)

Linux相关问答推荐

用户作用域在Linux内核密钥环(Golang)中是什么意思?

为什么库中不调用全局变量的构造函数?

仅查找并保留有效邮箱并删除无效记录,AWK

如何使用正则表达式在 LINux 中查找具有不同结尾的多个文件?

当接收端未从套接字读取时,通过 Unix 套接字发送的消息会发生什么情况?

编译过度对齐的动态分配变量时出现 icpc 错误

如何从linux调度程序中屏蔽一个cpu(防止它调度线程到那个cpu上)?

仅显示 tcsh 或 bash 中作为符号链接的文件和文件夹

使用带有 gnome-keyring 的 Git 凭证助手作为 Sudo 时出错

如何构建在 Android 上运行的本机(命令行)可执行文件?

你如何在 C 中的 Linux 上进行非阻塞控制台 I/O?

如何在不包括可用空间的情况下创建光盘(sd 卡)的 .IMG 映像?

从bash中的字符串中删除所有特殊字符和大小写

比较文件的日期 bash

linux中netstat和ss的区别?

是否有git sed或类似功能?

如何通过 xmllint 使用 XSD 验证 XML 文件

使用 WGET 运行 cronjob PHP

如何拖尾除第一行以外的所有行

如何计算一个单词在目录的所有文件中出现的次数?