我需要帮助使用 gdb 调试 apache(未找到调试符号)

我需要帮助使用 gdb 调试 apache(未找到调试符号)

我正在尝试调试在 RHEL4 上运行的 PHP/Apache 中的段错误。

这是一个生产服务器,因此我尝试安装 Apache 和 PHP 的单独副本,并通过 运行 apache gdb

当我加载httpd然后gdb执行时run -X,出现错误:

(no debugging symbols found)...
Error while reading shared library symbols:
Dwarf Error: Cannot handle DW_FORM_strp in DWARF reader.

Apache 手册中提到了有关将 EXTRA_CFLAGS 设置为 的内容-g,并且我已尝试使用 进行配置--enable-maintainer-mode,但似乎没有什么进展。

答案1

通过 gdb 调试像 Apache 这样带有完整模块(比如可能包括 mod_PHP)的复杂多进程/线程网络守护进程应用程序将会非常困难。

你认为错误的原因是什么之内Apache 的httpd,而不是应用程序(即 PHP 脚本)或模块(例如mod_PHP)?

具体的段错误信息是什么?

段错误是否发生在启动时、随机一段时间后、运行某个 Web 应用程序后,还是在特定时间后发生(大约每 48 小时)?

您是否增加或添加了 Apache httpdLog LevelApache 配置文件中的指令是否能获取更多信息?请尝试infodebug获取更多信息。

我已经使用 Apache httpd 近 15 年了,但从来没有调试过 Apache Web 服务器守护进程本身,所以我很惊讶您似乎需要使用 gdb 来调试它。


(未找到调试符号)

这意味着调试符号不包含在二进制可执行文件中。通常,编译器没有启用调试功能(-g使用 gcc 标记),和/或安装过程对strip可执行文件进行了 ped,以使其在运行时占用较少的内存。

读取共享库符号时出错:

此错误与共享(动态链接)库调试符号有关。

矮人错误:无法处理 DWARF 阅读器中的 DW_FORM_strp。

我之前没有见过这个错误,这可能是因为 Red Hat Enterprise Linux 4 的构建方式不同而发生的。矮人是一种调试信息格式。Linux 系统上另一种常见格式是刺伤.基本上似乎是在暗示共享库也被“剥离”了调试信息。

更正:这意味着调试器(gdb)无法读取/找到字符串指针(strp)。这可能是由于GDB错误 7358或编译器/调试器版本不匹配。

共享库通常在单独的包中包含调试信息(符号)。例如,我相信 RHEL 的 GNU 标准 C 库 (glibc) 调试信息位于名为 的包中glibc-debug。您需要安装 Apache httpd 使用的库的调试信息。检查 Apache rpm 包的库依赖项以获取可执行文件所依赖的库列表-rpm -qR package-name或者rpm -qpR <rpm-file>


我已尝试使用--enable-maintainer-mode进行配置,但似乎没有什么进展。

抱歉,但这些信息太模糊,无法帮助您。您需要提供更多有用的详细信息。

更新:automake's的用法维护者模式主要用于包装或开发,不用于调试。


考虑使用 PHP 调试器,例如调试使用 PHP 应用程序或脚本。


总结评论

我将尝试总结此处评论中的信息:

  • 生成 gdb 回溯(来自 PHP)
  • 需要使用调试功能构建的 PHP(包括符号)
  • 可以使用EXTRA_CFLAGS="-g" make或来构建带调试功能的 PHP
  • 最好使用configure --enable-debug參考), 其次是make

这似乎已经解决了调试符号问题。

答案2

确保调试符号不会在 Apache 安装过程中被删除。在将二进制文件复制到 /usr/local/bin 或其他地方时,通常会对二进制文件运行“strip”以删除所述符号。

答案3

RH 将调试符号打包在单独的 rpm 包中。

尝试安装这些...

答案4

我认为包含调试信息的 RPM 名为<pkg>-debuginfo-<...>。您可以在 Fedora 12 下使用命令安装它们debuginfo-install <pkg>,该命令在 Red Hat 系统下也可以使用。

相关内容