我正在尝试调试在 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 Level
Apache 配置文件中的指令是否能获取更多信息?请尝试info
或debug
获取更多信息。
我已经使用 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 系统下也可以使用。