将核心转储加载到GDB时,会显示自动崩溃的原因.例如
程序以信号11,分段故障结束.
有没有办法再次获取信息?问题是,我正在编写一个需要此信息的脚本.但是如果信号仅在加载核心转储后才可用,那么我以后就无法访问这些信息.
这样一个重要的功能真的没有命令吗?
我目前正在编写Python GDB脚本.问题是它必须与GDB 7.1兼容.所以我首先编写了GDB 7.3.1的脚本,并使用以下函数来接收gdb命令(GDB 7.3.1)的输出:
myvar = gdb.execute("info target", False, True)
Run Code Online (Sandbox Code Playgroud)
这个函数的最后一个参数是它应该将结果作为字符串返回(这非常有意义;为什么我会执行这样的命令;))
在GDB版本7.1中虽然似乎最后一个参数不可用,因此这一行(GDB 7.1):
myvar = gdb.execute("info target", False)
Run Code Online (Sandbox Code Playgroud)
回报None.
有没有机会检索此命令的输出?我已经尝试将我的python脚本的标准输出重定向到一个文件,然后加载这个文件,但显然我的python脚本的标准输入和输出被gdb环境覆盖,因此gdb.execute命令的输出不会被写入到我的档案.
我现在唯一能想到的就是用一个bash脚本包装我的脚本,该脚本首先使用python脚本打开gdb,该脚本执行各种命令,然后将其传输到文件中.然后再次打开gdb但是使用另一个加载文件的python脚本,解析它然后根据文件的输入执行其他命令,依此类推.但这是我能想到的最丑陋的解决方案.
那么有没有办法在GDB 7.1中接收gdb.execute的输出?
我想访问存储在没有调试符号的程序的核心转储中的帧(我想在C中执行此操作).当我在GDB中打开程序和核心转储时,我得到一个包含函数名称的堆栈跟踪.例如:
(gdb) bt
#0 0x08048443 in layer3 ()
#1 0x08048489 in layer2 ()
#2 0x080484c9 in layer1 ()
#3 0x0804854e in main ()
Run Code Online (Sandbox Code Playgroud)
所有函数的名称都存储在.strtab部分的可执行文件中.如何使用不同的框架构建堆栈跟踪?不能以批处理方式运行GDB .而且只是"从gdb中复制部分需要"也是一个坏主意,因为代码不是独立编写的.
所以更准确地提出我的问题:在哪里可以找到核心转储中的点,我可以在哪里开始读取堆栈信息?是否有某种图书馆可以访问这些信息?我可以使用的结构?或者更好的是,文档如何在核心转储中构建这些信息?
(我已经看到了" 如何从C中的核心转储文件生成堆栈跟踪,而不调用gdb等外部工具 "的问题,但由于没有有效的答案,我想我会再问一次)
[编辑]我在Linux x86下这样做
我在 GDB 中有一个结构,想运行一个检查这个结构的脚本。在 Python GDB 中,您可以通过以下方式轻松访问结构
(gdb) python mystruct = gdb.parse_and_eval("mystruct")
Run Code Online (Sandbox Code Playgroud)
现在我得到了一个名为 mystruct 的变量,它是一个 GDB.Value 对象。我可以通过简单地将此对象用作字典来访问结构的所有成员(例如mystruct['member'])。
问题是,我的脚本不知道某个结构具有哪些成员。所以我想从这个 GDB.Value 对象中获取键(甚至是值)。但也不mystruct.values()是mystruct.keys()这里工作工作。
有没有可能访问这些信息?我认为您无法访问此信息的可能性很小,但我没有在任何地方找到它。Adir(mystruct)告诉我也没有键或值功能。我可以通过打印 mystruct 来查看所有成员,但是没有办法在 python 中获取成员吗?
我正在尝试从没有调试信息的程序(Linux)中分析核心转储.分析应该在C中自动完成,所以没有 GDB.
正如我在GDB中看到的那样,可以通过命令获得堆栈指针和堆栈基指针(ESP和EBP)的顶部info registers.当我上下移动堆栈(命令up和down)时,我看到当前帧的寄存器的更新版本.
我的问题是,我在哪里可以在核心转储中找到这些信息?我知道核心转储中有一个包含NT_PRSTATUS,NT_PRPSINFO和NT_AUXV的NOTE部分.但遗憾的是,我无法找到有关该笔记的任何信息.GDB如何构建框架,从哪里获取信息?
我是C的新手,尤其是编写静态库,我的库中出现了奇怪的行为.
我写了一个名为cde的静态库.我用gcc将不同的部分编译成.o文件,然后我用ar将它们全部放在一个.a文件中
现在,当我想测试我的库时,我会执行以下操作:
gcc test.c -L../bin -lcde -lelf
libcde.a是我的库,位于../bin.libelf.a是我的库所需的库(我不知道如何将它直接放入我自己的库中......).
问题是我可以调用我的库的每个函数,而不必包含我的库的头文件.怎么可能?在编译时,文件不应该链接,因此编译器应该不知道我的库中有哪些函数可用...
当我按以下方式运行时,
gcc -L../bin -lcde -lelf test.c
文件test.c找不到我的头文件中定义的任何函数,即使我已经包含它.
我想我在这里做了一些根本性的错误,但我真的找不到什么.