当使用 valgrind 检查内存泄漏时,我遇到了一个非常奇怪的问题。在 32 位 linux 上,泄漏堆栈信息非常清晰,例如:
==10650== 由 0x8130FD3: SFNTSetContactServer ==10650== by 0x81106CA: CLibLicense::GetOneLicense(std::string&, void*&) ==10650== 由 0x81108C2: CLibLicense::StartingGet(void*&) ==10650== 由 0x810F01A: CLibLicense::GetLicense() ==10650== by 0x810DEBB: CLicenseManager::DoGetLicense(void*, unsigned int)
但是在 x64 linux 上,我只能得到??? 像这样的信息:
==31031== 1 个块中的 8 个字节在 2,210 的丢失记录 196 中肯定丢失了 ==31031== 在 0x4A0646F:malloc (vg_replace_malloc.c:236) ==31031== 由 0x46AF78: ??? (在 /opt/usr/local/sbin/Server 中) ==31031== 由 0x46B016: ??? (在 /opt/usr/local/sbin/Server 中) ==31031== 由 0x421F99: ??? (在 /opt/usr/local/sbin/Server 中) ==31031== 由 0x42C240: ??? (在 /opt/usr/local/sbin/Server 中) ==31031== 由 0x42D731: ??? (在 /opt/usr/local/sbin/Server 中) ==31031== 由 0x42FC65: ??? (在 /opt/usr/local/sbin/Server 中) ==31031== 由 0x465C01: ??? (在 /opt/usr/local/sbin/Server 中) ==31031== 由 0x463DB6: ??? (在 /opt/usr/local/sbin/Server 中) ==31031== 由 0x3116A1D993 :(在 main 下方)(在 /lib64/libc-2.5.so 中)
正如 valgrind FAQ 所说,该程序不使用 dlopen/dlclose。
更新1,添加文件统计信息
文件服务器 服务器:ELF 64 位 LSB 可执行文件,AMD x86-64,版本 1 (SYSV),适用于 GNU/Linux 2.6.9,动态链接(使用共享库),适用于 GNU/Linux 2.6.9,未剥离
欢迎任何意见!