【问题标题】:Need GLIBC debug information from rpmbuild of updated source需要来自更新源的 rpmbuild 的 GLIBC 调试信息
【发布时间】:2012-10-31 04:28:41
【问题描述】:

我正在处理RHEL WS 4.5

我已经获得了匹配这个系统的glibc源rpm,打开它使用rpm2cpio获取它的内容。

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

我将所有这些都安装在测试虚拟机上(从相同的 RH 基础映像创建),并且可以确认我的更改已包含在内。

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

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

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

我的测试包括一个本地构建的 python,并且为 python 找到了完整的符号。

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

_enable_debug_packages

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

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

【问题讨论】:

    标签: gdb glibc rpmbuild


    【解决方案1】:

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

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

    有不同的版本;它们不可能来自同一个 -debuginfo RPM。

    这两个都被文件命令报告为剥离。

    这些应该显示为已剥离。要么它们没有正确构建,要么你的 strip 被破坏了。

    还请注意,您实际上不必通过所有这些工作来调试您的问题。在RPMBUILD 目录中,您应该能够找到glibc 构建目录,带有完整调试libc.so.6。只需将该库复制到您的虚拟机中,您就不必担心debuginfo RPM。

    【讨论】:

    • 哇...不知道为什么我没有注意到 2.3.6 与 2.3.4 的差异。我刚刚重做了 rpm2cpio | cpio 摘录:
    • 让我再试一次......所以网站不允许我使用回车键
    • 我刚刚对 RHWS4.5 install .iso 中的 rpm2cpio 提取物进行了重复试验:SRPMS/glibc-2.3.4-2.36.src.rpm ...里面的源压缩包是: glibc-2.3.6.tar.bz2 ...然后我为昨天安装的 2.3.6 文件之一做了rpm -qf 并得知它们来自 2.3.4 rpm。因此,似乎 RH 在源 RPM 内部存在问题,与 2.3.4/2.3.6 混淆。
    • 很抱歉打破这个,但我无法添加段落。
    • 我会试试你的建议。直接使用构建 libc*.so。最后,我关心的只是能够调试我的更改。
    【解决方案2】:

    尝试验证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 的内容

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

    在尝试将 strack 跟踪添加到 mtrace 时,请确保不要在 GLIBC malloc 挂钩中直接或间接调用 malloc()

    【讨论】:

      猜你喜欢
      • 2015-02-07
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多