在相当旧的 Linux 系统上,我无法获取 gdb 之后可以读取的核心转储。内核版本是3.8.13,libc版本是2.3.4。
ulimit -c
设置为无限制,并且 /proc/sys/kernel/core_pattern
指向有效的可写文件位置。当我中止任何进程(kill -6 PID
)时,它会在指定的位置生成一个核心文件。然而,当稍后尝试使用 gdb -core filename
读取核心文件时,我总是收到错误消息“无法从内存中读取有效的对象文件图像。”此消息的确切含义是什么以及导致它的原因是什么?我还将 /proc/<pid>/coredump_filter
中的所有位设置为 1,但没有帮助。
此外,我发现当我将 gdb 附加到进程,然后使用命令
generate-core-file
从 gdb 创建核心文件时,它会生成一个核心文件,我可以将其读入 gdb 而不会收到此警告。我尝试将核心文件加载到gdb版本6.3.50和版本7.10-1ubuntu中。
但是,当稍后尝试使用
读取核心文件时,我总是收到错误消息“无法从内存中读取有效的对象文件图像。”gdb -core filename
您很可能会忽略该警告。
gdb -core filename
之后你想做什么?您可能想要gdb ./a.out core
(这会产生相同的警告,但应该为您提供一个可用的GDB会话)。
导致“无法从内存中读取有效的目标文件图像。”的原因
某些版本的 GDB 不理解 VDSO,它出现在共享对象的加载程序列表中,但实际上不是一个,并发出上面的警告。可以忽略此警告。