调试C ++应用程序/ linux的文件对我来说一直是个谜,缺乏一些基本的理解。
(1)我们是否需要使用-g标志编译应用程序,而核心文件无法提供任何有用的信息?但我发现,即使我们不使用-g标志进行编译,也会生成核心文件 - 因此除了占用磁盘空间外,它们必须用于某种目的。
维基百科说:“在计算中,核心转储,内存转储或存储转储包括计算机程序在特定时间记录的工作内存状态,通常是程序异常终止(崩溃)”。
这应该意味着无论我们是否使用-g标志编译,我们仍然有状态。如果我们有堆栈跟踪,我们仍然应该能够知道导致错误的函数。
答案 0 :(得分:2)
-g
选项与核心文件无关,而是将调试信息放在程序中。也就是说,生成的可执行文件将包含所有符号(例如函数和变量名称)以及行号信息(因此您可以找出发生崩溃的行)。
实际核心转储仅包含内存转储。是的,您可以与程序一起获得堆栈跟踪,但除非程序有调试信息,否则您无法查看函数名称或行号,只能查看其地址。
答案 1 :(得分:1)
因此除了占用磁盘空间
之外,它们必须用于某种目的
您可以使用ulimit -c $limit
命令限制核心文件的大小,并且您的核心文件不会占用您的磁盘空间。
而且,正如Joachim已经说-g
选项只包含调试符号和检查程序。