我正在使用 g++ 4.3 构建一个应用程序。我正在使用最大可能的优化级别,而不是使用该-g
选项,并且我在构建后剥离符号。
如果我不从我的应用程序和库中删除符号,核心文件仍然有用吗? (当应用程序崩溃时生成它们。)
如果我以最大可能的优化方式编译应用程序,核心文件会有用吗? (没有-g
选项,也没有剥离符号。)
答案1
从广义上讲,核心文件是进程使用的整个内存加上 CPU 寄存器状态的转储。因此,一般来说,您可以从核心文件中检索到的信息与您在崩溃之前将调试器附加到进程中可以获得的信息相同。
如果我做不是从我的应用程序和库中删除符号,核心文件仍然有用吗?
来自维基百科页面核心转储:
“在现代类 Unix 操作系统上,管理员和程序员可以使用 GNU Binutils 二进制文件描述符库 (BFD) 读取核心转储文件,[...] 该库将为内存区域中的给定地址提供原始数据来自核心转储;它不知道该内存区域中的变量或数据结构,因此使用该库读取核心转储的应用程序必须确定变量的地址并确定数据结构本身的布局,例如通过使用符号表用于正在调试的程序。''
所以你的第一个问题的答案是:不,如果从可执行文件中删除符号,则核心转储文件几乎没有用处。
但是,符号只会占用一些磁盘空间,不会影响性能:您可以使用最大优化进行编译和
-g
同时。
如果我以最大可能的优化方式编译应用程序,核心文件会有用吗?
由于核心文件只是应用程序崩溃时内存和处理器状态的转储,因此有关优化和调试的一般警告适用:调试器只会查找信息(例如,变量的值或函数中的函数调用)。堆栈回溯)如果没有优化的话。