我正在尝试调试在 RHEL4 上运行的 PHP/Apache 中的段错误。
这是一个生产服务器,所以我尝试安装 Apache 和 PHP 的单独副本,并通过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
,但我似乎并没有走得太远。
很难调试复杂的多进程/线程网络守护程序应用程序,如 Apache,通过 gdb 完成模块(例如可能包括 mod_PHP)。
为什么您认为错误出在Apache 中
httpd
,而不是应用程序(即 PHP 脚本)或模块(例如mod_PHP
)?确切的段错误消息是什么?
段错误发生在启动时、随机时间后、运行某个 Web 应用程序后还是特定时间量(大约每 48 小时)?
您是否
Log Level
在 Apache 配置文件中增加或添加了 Apache httpd 指令以获取更多信息?尝试info
或debug
获取最多信息。我已经使用 Apache httpd 将近 15 年了,而且我从来没有调试过 Apache Web 服务器守护进程本身,所以我很惊讶您似乎需要使用 gdb 来调试它。
这意味着调试符号不包含在二进制可执行文件中。通常,编译器没有启用调试(
-g
带有 gcc 的标志),和/或安装过程strip
ped 可执行文件,以使其在运行时占用更少的内存。此错误与共享(动态链接)库调试符号有关。
我以前没有见过这个错误,可能是因为 Red Hat Enterprise Linux 4 的构建方式不同。DWARF是一种调试信息格式。在 Linux 系统上发现的另一种常见格式是Stabs。
基本上似乎暗示共享库也被“剥离”了调试信息。更正:这意味着调试器(
gdb
)无法读取/找到字符串指针(strp
)。这可能是由于 GDB错误 7358或编译器/调试器版本不匹配。共享库通常在单独的包中包含调试信息(符号)。例如,我相信 RHEL 的 GNU 标准 C 库 (glibc) 调试信息位于一个名为
glibc-debug
. 您将需要安装 Apache httpd 使用的库的调试信息。检查 Apache rpm 包的库依赖项以获取可执行文件所依赖的库列表-rpm -qR package-name
或rpm -qpR <rpm-file>
.对不起,这太模糊了,无法帮助您。您需要包含更多有用的详细信息。
更新:
automake
的维护者模式的使用主要用于打包或开发,而不是调试建议。考虑使用 PHP 调试器,例如带有 PHP 应用程序或脚本的Xdebug 。
总结评论
我将尝试从这里的评论中总结信息:
EXTRA_CFLAGS="-g" make
或configure --enable-debug
( ref ),然后是make
这似乎已经解决了调试符号。
确保调试符号没有作为 apache 安装过程的一部分被剥离。当它们被复制到 /usr/local/bin 或任何地方时,通常在二进制文件上运行“strip”以删除所述符号。
RH 将调试符号打包在单独的 rpm 包中。
尝试安装这些...
我认为包含调试信息的 RPM 被命名为
<pkg>-debuginfo-<...>
.debuginfo-install <pkg>
您可以在 Fedora 12 下使用命令安装它们,它也可以在 Red Hat 系统下运行。