php小编小新为您介绍如何为正在运行的进程加载调试符号。在软件开发过程中,调试是一个非常重要的环节。当我们遇到正在运行的进程出现问题时,我们需要加载调试符号来进行调试。调试符号包含了代码的符号信息,能够让我们在调试过程中更加准确地定位问题所在。在这篇文章中,我们将详细讲解如何为正在运行的进程加载调试符号,帮助您更好地进行调试工作。
问题内容
我有一个在许多机器上运行的 C 应用程序,有时一个实例会出现问题并且表现得很奇怪。不幸的是,这种情况几乎从未发生过。这些产品实例经过大量优化(-march=XXX -Ofast
)进行编译,并且不包含任何调试符号,因此我无法轻松附加调试器来分析它们的状态。
但我认为应该可以使用相同的标志加上 -g3
再次编译应用程序,然后我可以使用 symbol-file application_executable_with_debug_symbols
将其加载到 gdb 中。但是,如果我这样做,那么断点永远不会触发。
是否有另一种方法可以将调试器附加到正在运行的应用程序并加载调试符号?或者我做错了什么(明显的)?
谢谢
解决方法
最佳实践是使用调试符号构建应用程序,保留生成的二进制文件以进行调试,但运行 strip -g app.debug -o app.release
并在生产中运行剥离的二进制文件。
当您发现行为异常的实例时,您可以将完整调试版本复制到目标计算机,然后运行 gdb -ex 'attach $PID' app.debug
。瞧:你有完整的调试符号。
再次编译应用程序不起作用的最可能原因是您获得了具有不同符号的新二进制文件(比较 nm app.debug
与 nm app.release
),以及最可能的原因 (如果使用 GCC)是您省略了一些用于构建 app.release
的优化标志,或者您使用了略有不同的源 - 您必须使用完全相同的标志(并添加-g
)和完全相同的来源,以实现该方法的成功。
以上就是如何为正在运行的进程加载调试符号?的详细内容,更多请关注编程网其它相关文章!