小编Uhl*_*hlo的帖子

如何在GDB中打印最后收到的信号?

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

程序以信号11,分段故障结束.

有没有办法再次获取信息?问题是,我正在编写一个需要此信息的脚本.但是如果信号仅在加载核心转储后才可用,那么我以后就无法访问这些信息.

这样一个重要的功能真的没有命令吗?

linux debugging gdb coredump

13
推荐指数
2
解决办法
5663
查看次数

如何从PythonGDB(GDB 7.1)中的gdb.execute获取输出?

我目前正在编写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的输出?

python linux gdb dump

6
推荐指数
1
解决办法
3416
查看次数

如何从核心转储中读取帧(没有GDB)?

我想访问存储在没有调试符号的程序的核心转储中的帧(我想在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下这样做

stack gdb coredump frames

6
推荐指数
1
解决办法
9454
查看次数

如何访问 Python GDB Value 的键或值

我在 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 中获取成员吗?

python linux gdb

5
推荐指数
1
解决办法
3436
查看次数

如何从核心转储中提取EBP和ESP?

我正在尝试从没有调试信息的程序(Linux)中分析核心转储.分析应该在C中自动完成,所以没有 GDB.

正如我在GDB中看到的那样,可以通过命令获得堆栈指针和堆栈基指针(ESP和EBP)的顶部info registers.当我上下移动堆栈(命令updown)时,我看到当前帧的寄存器的更新版本.

我的问题是,我在哪里可以在核心转储中找到这些信息?我知道核心转储中有一个包含NT_PRSTATUS,NT_PRPSINFO和NT_AUXV的NOTE部分.但遗憾的是,我无法找到有关该笔记的任何信息.GDB如何构建框架,从哪里获取信息?

linux gdb coredump cpu-registers

3
推荐指数
1
解决办法
1468
查看次数

静态库不需要头文件?

我是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找不到我的头文件中定义的任何函数,即使我已经包含它.

我想我在这里做了一些根本性的错误,但我真的找不到什么.

c linux linker gcc

0
推荐指数
2
解决办法
2535
查看次数

标签 统计

gdb ×5

linux ×5

coredump ×3

python ×2

c ×1

cpu-registers ×1

debugging ×1

dump ×1

frames ×1

gcc ×1

linker ×1

stack ×1