debugging 使用LLDB调试核心文件,不带可执行文件,但带有调试符号文件

lf3rwulv  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个核心转储文件需要调试。但我唯一的文件崩溃的程序是一个调试符号文件
执行和调试文件是使用以下命令生成的:

$ gcc -g -O0 -o <exec> main.c
$ objcopy --only-keep-debug <exec> <exec>.dbg
$ strip --strip-debug --strip-unneeded <exec>

字符串
当我以核心文件为目标运行lldb并尝试添加符号文件时,lldb给我一个错误:

$ lldb -c <core-file>
(lldb) target symbols add <exec>.dbg
error: symbol file '<exec>.dbg' does not match any existing module


然后,我尝试用我的.dbg文件添加模块,然后才将其添加为symfile。这次没有错误,但仍然没有添加符号--bt在1个线程中只给了我1个帧,并且在gui模式下我看不到任何代码

$ lldb -c <core-file>
(lldb) target modules add <exec>.dbg
(lldb) target symbols add <exec>.dbg

我的问题是:

首先,我几乎没有找到任何关于什么是lldb“模块”的信息
其次,我不明白为什么lldb需要除了我的核心和调试文件之外的任何信息。核心文件有内存的快照,调试文件有所有的符号,可以帮助解析核心文件的内容,以“人类可读”的形式。
最后,是否有可能调试核心文件与符号,但没有可执行文件?如果lldb中没有,也许在gdb或其他debbuger中有方法?或者,我可能错误地生成了调试文件?

wwodge7n

wwodge7n1#

也许在gdb或其他debbuger中有一种方法?
这对我很有效:

gdb -q a.dbg core
Reading symbols from a.dbg...

warning: core file may not match specified executable file.

Core was generated by `./a.out'.
Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50        return ret;

(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007fcad7676797 in __GI_abort () at abort.c:79
#2  0x0000000000203af9 in foo () at main.c:5
#3  0x00007ffe54685830 in ?? ()
#4  0x0000000000203b14 in main () at main.c:10

字符串

**更新:**以下是我采取的具体步骤:

// t.c
#include <stdlib.h>

int foo() {
  abort();
}

int main()
{
  return foo();
}
// t.sh
#!/bin/bash
ulimit -c unlimited
gcc -g t.c &&
objcopy --only-keep-debug a.out a.dbg &&
strip --strip-debug --strip-unneeded a.out

./a.out
rm -f a.out

gdb -q a.dbg core

的数据
注意:即使有一个合理的堆栈,它也是 * 不 * 正确的:frame#3并不存在。
一般来说,请注意,你做错了--调试器需要访问代码,而不仅仅是调试符号来展开堆栈(尽管我不确定为什么会这样)。
您应该 * 要么 * 保留原始的(未剥离的)a.out,* 要么 * 保留 * 剥离的a.out * 和 * a.dbg

相关问题