跨不同 Linux 发行版调试核心文件
当核心文件在与您的开发环境不同的 Linux 发行版上生成时,堆栈跟踪可能并不完全有意义。动态链接的可执行文件依赖于共享库中的地址,并且这些地址在不同的发行版之间可能有所不同。 GDB 可能会错误地将崩溃归因于您的库副本中的函数,而客户的系统可能在同一地址具有不同的函数。
要验证堆栈跟踪的准确性,可以反汇编有问题的函数显示该地址属于一条指令或前面有一条非 CALL 指令。在这种情况下,堆栈跟踪是不可靠的。
要获得更准确的跟踪,您可以要求客户提供有问题的二进制文件使用的以下库:
cd / tar cvzf to-you.tar.gz lib/libc.so.6 lib/ld-linux.so.2 ...
在您的系统:
mkdir /tmp/from-customer tar xzf to-you.tar.gz -C /tmp/from-customer gdb /path/to/binary (gdb) set solib-absolute-prefix /tmp/from-customer (gdb) core core # Important: Set solib-... before loading core (gdb) where # Get meaningful stack trace!
优化调试二进制文件
与其建议客户运行 -g 二进制文件,首选方法是使用 -g 和 -O2 优化标志构建二进制文件,并在分发之前去除调试信息:
build with -g -O2 -o myexe.dbg strip -g myexe.dbg -o myexe distribute myexe to customers when a customer gets a core, use myexe.dbg to debug it
这允许完整的符号调试(文件/行、局部变量),而无需共享敏感的源代码详细信息。
以上是如何准确调试不同Linux发行版生成的核心文件?的详细内容。更多信息请关注PHP中文网其他相关文章!