我有一个在很多机器上运行的C应用程序,有时一个示例会出现问题,行为怪异。不幸的是,这种情况几乎从来没有发生过。这些产品示例是用大量优化(-march=XXX -Ofast
)编译的,不包括任何调试符号,所以我不能很容易地附加调试器来分析它们的状态。
但是我想应该可以用相同的标志加上-g3
再次编译应用程序,然后我可以用symbol-file application_executable_with_debug_symbols
将其加载到gdb中。
有没有其他方法可以将调试器附加到正在运行的应用程序并加载调试符号?或者有什么(明显的)我做错了吗?
谢谢
1条答案
按热度按时间mf98qq941#
最佳实践是构建 * 带有 * 调试符号的应用程序,保留生成的二进制文件用于调试,但运行
strip -g app.debug -o app.release
并在生产环境中运行剥离的二进制文件。当您发现一个行为异常的示例时,您可以将完整的调试版本复制到目标机器上,然后运行
gdb -ex 'attach $PID' app.debug
。您有完整调试符号。再次编译应用程序不起作用的最可能的原因是您得到了一个具有不同符号的新二进制文件(比较
nm app.debug
与nm app.release
),以及最可能的原因 *(如果使用GCC)的一个缺点是您忽略了一些用于构建app.release
的优化标志,或者您使用了稍微不同的源代码--您 * 必须 * 使用完全相同的标志(并添加-g
)和完全相同的源代码,才有希望使用该方法获得成功。