C++ GDB:运行不带符号的cpp进程调试

C++ GDB:运行不带符号的cpp进程调试,c++,debugging,gdb,C++,Debugging,Gdb,运行应用程序的Linux系统。此应用程序是没有任何调试符号的cpp二进制文件。该应用程序如何使用100%的cpu。想调试它为什么无限运行。如果我停止并用调试符号替换二进制文件,则问题可能无法再现 因此,在另一个环境中使用调试符号运行同一个应用程序。这里运转良好 我可以比较它们(使用和不使用调试符号二进制文件)并推断出使用GDB的问题所在 此应用程序是没有任何调试符号的cpp二进制文件 您不需要任何调试符号来理解它在哪里花费时间,您只需要应用程序不被完全剥离(大多数二进制文件不是这样) 使用per

运行应用程序的Linux系统。此应用程序是没有任何调试符号的cpp二进制文件。该应用程序如何使用100%的cpu。想调试它为什么无限运行。如果我停止并用调试符号替换二进制文件,则问题可能无法再现

因此,在另一个环境中使用调试符号运行同一个应用程序。这里运转良好

我可以比较它们(使用和不使用调试符号二进制文件)并推断出使用GDB的问题所在

此应用程序是没有任何调试符号的cpp二进制文件

您不需要任何调试符号来理解它在哪里花费时间,您只需要应用程序不被完全剥离(大多数二进制文件不是这样)

使用
perf record-p$pid
收集CPU配置文件,然后使用
perf report
对其进行分析

如果应用程序已完全剥离,您仍然可以使用
perf record
收集程序计数器值,然后
perf record--symfs…
将其指向应用程序的未剥离副本。文件


注意:剥离副本和非剥离副本都必须使用完全相同的构建标志构建,否则会产生垃圾。最佳做法是在生成过程中始终保存未压缩的副本。

探查器可能会帮助您缩小问题站点的范围。您可能无法获得函数名,但您应该获得一个地址。如果您将链接器配置为提供一个内存映射,您可以使用内存映射返回问题函数。太好了。你能用一些例子来解释更多的细节吗?调试符号不需要内置到正在运行的二进制文件中去调试,你只需要将带有调试符号的二进制文件加载到gcc@AlanBirtles,您可以通过示例提供更多详细信息吗?但应用程序环境仅限于获取性能报告。其他任何方法都只能使用GDB来解决这个问题。@Kranthi以什么方式限制?