调试符号是不是加载到 Linux 上的内存中?

Posted

技术标签:

【中文标题】调试符号是不是加载到 Linux 上的内存中?【英文标题】:are debug symbols loaded into memory on linux?调试符号是否加载到 Linux 上的内存中? 【发布时间】:2010-12-07 20:05:17 【问题描述】:

从可执行文件(或共享库)中去除调试符号会减少使用的内存量吗? (我知道它会减小磁盘文件的大小——我在这里感兴趣的是实际使用的 RAM)。

Drepper 的论文 (http://www.akkadia.org/drepper/dsohowto.pdf) 在第 13 页上说“正常符号表在运行时不使用,因此没有必要剥离二进制它”。

OTOH,strip 的手册页说“剥离的二进制文件(它)将占用更少的 RAM 空间”。

根据一些快速测试,看起来 Drepper 是正确的(这并不奇怪),因此 strip 的手册页是错误的。

谁能帮忙确认/拒绝?

TIA...

【问题讨论】:

在这两种情况下我都倾向于查看 /proc/[pidno]/maps @Chris Stratton:来自映射的页面是按需加载的,所以maps 只告诉您地址空间使用情况,而不是实际核心使用情况。 嗯,首先,如果它没有被映射,那么它不太可能最终占用 RAM。其次,我认为可以加载文件的哪些部分是一个比在任何给定时刻可以期望找到加载到实际物理内存中的页面更具确定性的问题,因为这取决于详细信息系统执行它。 但是,如果您想通过轶事来确定在任何给定时刻实际驻留的内容,/proc/pid/smaps 应该这样做 【参考方案1】:

在使用预读来加速启动和程序启动的系统上,调试符号确实会浪费文件缓存中的内存。

【讨论】:

ELF 加载器似乎可以在调试符号对应的范围内使用madvise(MADV_DONTNEED) @caf:不过,预读仍然会浪费时间读取数据。

以上是关于调试符号是不是加载到 Linux 上的内存中?的主要内容,如果未能解决你的问题,请参考以下文章

vs无法调试 ,还没有为该文档加载任何符号

调试用 yasm 创建的汇编代码

WCF 远程调试的符号位置

如何检查程序是不是使用调试符号编译? [复制]

远程调试 .Net 应用程序“没有为此文档加载任何符号”时出现问题。

据说调试符号不会为文档加载,即使它们是为 dll 加载的