【问题标题】:How to print the last received signal in GDB?如何在 GDB 中打印最后接收到的信号?
【发布时间】:2012-01-17 16:01:41
【问题描述】:

将核心转储加载到 GDB 时,会显示它自动崩溃的原因。例如

程序以信号 11 终止,分段错误。

有什么方法可以重新获取信息吗? 问题是,我正在编写一个需要这些信息的脚本。但是如果信号只有在加载核心转储后才可用,我以后就无法访问信息了。

这么重要的功能真的没有命令吗?

【问题讨论】:

    标签: linux debugging gdb coredump


    【解决方案1】:

    打印关于最后一个信号执行的信息

    p $_siginfo
    

    【讨论】:

    • 感谢您的选择!看来我只能在程序执行之后或期间执行此命令。每次我尝试使用核心转储时,它都会给我错误Unable to read siginfo
    • 这是预期的。它是 gdb 的内存状态,不会持久化到磁盘。
    • 我可以从核心转储文件中打印 $_siginfo 而无需执行程序。
    【解决方案2】:

    如果你知道核心文件名是什么,你可以发出target core命令重新指定目标核心文件:

    (gdb) target core core.8577
    [New LWP 8577]
    Core was generated by `./fault'.
    Program terminated with signal 11, Segmentation fault.
    #0  0x080483d5 in main () at fault.c:10
    10      *ptr = '\123';
    (gdb) 
    

    至于隐含的问题,info last signal 命令是什么?,我不知道。好像没有。


    核心文件名可以通过命令info target获取:

    (gdb) info target
    Symbols from "/home/wally/.bin/fault".
    Local core dump file:
        `/home/wally/.bin/core.8577', file type elf32-i386.
        0x00da1000 - 0x00da2000 is load1
        0x08048000 - 0x08049000 is load2
    ...
        0xbfe8d000 - 0xbfeaf000 is load14
    Local exec file:
        `/home/wally/.bin/fault', file type elf32-i386.
        Entry point: 0x8048300
        0x08048134 - 0x08048147 is .interp
        0x08048148 - 0x08048168 is .note.ABI-tag
        0x08048168 - 0x0804818c is .note.gnu.build-id
        0x0804818c - 0x080481ac is .gnu.hash
        0x080481ac - 0x080481fc is .dynsym
        0x080481fc - 0x08048246 is .dynstr
    ...
    

    【讨论】:

    • 谢谢,那么是否有可能读取给 gdb 本身的参数或将参数传递给我的脚本,例如“gdb executable core --batch -x myscript.py [在此处插入参数] " 因为我也发现了这种可能性,但因此我需要确定核心文件的名称,该名称通常通过 gdb 的参数给出
    • @Uhlo:命令info target 显示可执行文件和核心文件名,以及更多信息。也许这样可以?
    猜你喜欢
    • 2017-10-06
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2011-06-18
    相关资源
    最近更新 更多