当前位置: 首页 > 面试题库 >

当程序具有命令行参数时,如何使用GDB分析程序的核心转储文件?

马野
2023-03-14
问题内容

我的程序是这样运行的:

exe -p param1 -i param2 -o param3

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

我想分析核心转储文件

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

但是GDB会将EXE文件的参数识别为GDB的输入。

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


问题答案:

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

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选项。



 类似资料:
  • 问题内容: 如果我想解析该怎么办: 我想要的结果是: 我更喜欢使用Apache Commons CLI ,但是文档对我上面提到的情况有些不清楚。具体来说,文档没有告诉您如何处理我在下面指定的第3种类型的选项: 我希望Apache Commons CLI可以正常工作,但是如果这些args没有选项前缀,仍然可以将常规args传递给程序。也许可以,但是文档没有这么说,因此在我阅读它时… 问题答案: 您可

  • 问题内容: 如何接收文件作为命令行参数? 问题答案: 仅传递文件的路径,在程序内部使用Java File类处理它 这将第一个参数作为文件路径:

  • 问题内容: 我的程序是用C ++编写的。使用-g3-O0-ggdb标志使用gcc编译。当它崩溃时,我想打开它的核心转储。它会创建核心转储文件,还是我需要做一些事情以在程序本身或在执行该文件的计算机上启用核心转储创建?该文件的创建位置以及名称是什么? 问题答案: 您需要设置。如果此参数的值为0,则不会创建coredump文件。这样做:并检查是否一切正确。当应用程序完成某些不适当的操作时,将创建cor

  • 匹配可以用来解析简单的参数: use std::env; fn increase(number: i32) { println!("{}", number + 1); } fn decrease(number: i32) { println!("{}", number - 1); } fn help() { println!("usage: match_args <stri

  • 问题内容: 我的程序正在获取命令行参数。使用Ant时如何通过? 问题答案: 扩展了Richard Cook的答案。 这是运行任何程序(包括但不限于Java程序)的任务: 这是从文件运行Java程序的任务: 您可以像这样从命令行调用: 确保使用语法;如果运行此命令: 然后将尝试运行目标和。

  • 问题内容: 我需要一种 从应用程序内部 请求堆转储 的方法 。 基本原理:当遇到特定的错误情况时,我想转储堆,以便可以看到内存中有什么内容。 但是我想使它自动化(例如,当我检测到某些特定情况发生时。或者当看门狗不再收到ping命令时;当某些测试失败时)。因此,我需要一种从应用程序本身内部转储堆的方法。我似乎无法通过MX bean的东西找到它。尽管MX Bean可以通过监视器和“可拥有的同步器”信息