0

C++应用程序/linux的调试文件对我来说一直是个谜,缺乏一些基本的了解。

(1) 我们是否需要编译带有 -g 标志的应用程序,否则核心文件无法提供任何有用的信息?但我看到,即使我们不使用 -g 标志进行编译,也会生成核心文件——所以除了占用磁盘空间之外,它们必须有其他用途。

维基百科说:“在计算中,核心转储、内存转储或存储转储由计算机程序在特定时间的工作内存的记录状态组成,通常是在程序异常终止(崩溃)时”。

这应该意味着无论我们是否使用 -g 标志编译,我们仍然有状态。如果我们有堆栈跟踪,我们应该仍然能够知道是什么函数导致了错误。

4

2 回答 2

2

-g选项与核心文件无关,而是将调试信息放入程序中。也就是说,生成的可执行文件将包含所有符号(例如函数和变量名称)以及行号信息(因此您可以找出崩溃发生在哪一行)。

实际的核心转储仅包含内存转储。是的,您可以与程序一起获得堆栈跟踪,但除非程序具有调试信息,否则您看不到函数名称或行号,只能看到它们的地址。

于 2012-06-14T07:20:26.993 回答
1

所以除了占用磁盘空间之外,它们必须有其他用途

您可以使用ulimit -c $limit命令限制核心文件的大小,并且您的核心文件不会占用您的磁盘空间。

而且,正如 Joachim 已经说过的,-g选项只包括调试符号和对您的程序的检查。

于 2012-06-14T07:28:06.850 回答