Gdb 需要更新源的rpmbuild中的GLIBC调试信息

Gdb 需要更新源的rpmbuild中的GLIBC调试信息,gdb,glibc,rpmbuild,Gdb,Glibc,Rpmbuild,我正在开发RHEL WS 4.5 我已经获得了与此系统匹配的glibc源rpm,并使用rpm2cpio打开它以获取其内容 在该树中,我创建了mtrace.c的补丁(我想添加更多堆栈回溯级别),并将其合并到spec文件中,并创建了一组新的RPM,包括debuginfo RPM 我将所有这些都安装在一个测试vm上(从同一个RH base映像创建),并且可以确认包含了我的更改 但是由于执行更复杂,我在mtrace.c中崩溃了。。。但是gdb找不到调试信息,所以我没有得到行号信息,也无法实际调试故障 根

我正在开发RHEL WS 4.5

我已经获得了与此系统匹配的glibc源rpm,并使用rpm2cpio打开它以获取其内容

在该树中,我创建了mtrace.c的补丁(我想添加更多堆栈回溯级别),并将其合并到spec文件中,并创建了一组新的RPM,包括debuginfo RPM

我将所有这些都安装在一个测试vm上(从同一个RH base映像创建),并且可以确认包含了我的更改

但是由于执行更复杂,我在mtrace.c中崩溃了。。。但是gdb找不到调试信息,所以我没有得到行号信息,也无法实际调试故障

根据日期,我想我可以确认调试信息已安装在/usr/src/debug/glibc-2.3.6中的测试系统上/

我试过了
sharedlibrary libc*
在gdb中,它告诉我符号已经加载

我的测试包括一个本地构建的python,可以找到python的完整符号

我的感觉是,可能glibc不是在启用调试的rpmbuild下构建的。我已经查看了glibc.spec文件,甚至用

_启用调试包

定义为1,看起来可能会影响结果。我对在rpmbuild构建步骤中调用的配置脚本的检查没有给我任何提示

嗯。。刚刚找到/usr/lib/debug/lib/libc-2.3.4.so.debug 和/usr/lib/debug/lib/tls/i486/libc-2.3.4.so.debug
但这两个都被file命令报告为剥离。

您似乎正在安装不匹配的RPM:

/usr/src/debug/glibc-2.3.6
刚刚找到/usr/lib/debug/lib/libc-2.3.4.so.debug

同一版本中没有相同的版本;他们不可能来自同一个地方——debuginfo RPM

文件命令会将这两项报告为剥离

这些不应显示为剥离。要么它们没有正确构建,要么您的
条带
已损坏


还要注意的是,您实际上不必让所有这些都工作起来来调试您的问题。在
RPMBUILD
目录中,您应该能够找到glibc build目录,其中包含完整的debug
libc.so.6
。只要将该库复制到您的VM中,您就不必担心
debuginfo
RPM。

尝试验证
mtrace.c
的调试信息是否确实存在。首先查看GLIBC的单独调试信息是否知道名为
mtrace.c
的编译单元:

$ eu-readelf -w /usr/lib/debug/lib64/libc-2.15.so.debug  > t
$ grep mtrace t
           name                 (strp) "mtrace.c"
             name                 (strp) "mtrace"
 1     0     0         0         mtrace.c
 [10480]  "mtrace.c"
 [104bb]  "mtrace"
 [5052] symbol: mtrace, CUs: 446
然后查看GDB是否确实从glibc debuginfo RPM中找到了源文件:

(gdb) set pagination off
(gdb) start # pause your test program right after main()
(gdb) set logging on
Copying output to gdb.txt.
(gdb) info sources
退出GDB,然后在GDB.txt中grep for mtrace,您会发现类似于
/usr/src/debug/glibc-2.15-a316c1f/malloc/mtrace.c的内容

这适用于GDB7.4。我不确定RHEL4.5附带的GDB版本是否支持上面使用的所有命令。不过,从源代码构建上游GDB实际上比Python更容易


尝试将strack跟踪添加到mtrace时,请确保不要在GLIBC malloc hook中直接或间接调用
malloc()。。。不知道为什么我没有注意到2.3.6和2.3.4之间的差异。我刚刚重拨了rpm2cpio | cpio摘录:让我再试一次。。。so网站不允许我使用回车键inI只是从RHWS4.5 install.iso中试用了rpm2cpio摘录:SRPMS/glibc-2.3.4-2.36.src.rpm。。。里面的源tarball是:glibc-2.3.6.tar.bz2。。。然后,我对昨天安装的2.3.6文件中的一个进行了
rpm-qf
,了解到它们来自于2.3.4rpm。因此,似乎RH在源RPM内部存在问题,2.3.4/2.3.6出现混乱。很抱歉,我无法添加段落。我将尝试您的建议。直接使用build libc*.so。最后,我所关心的是能够调试我的更改。