GDB本地可读取调试符号,云端服务器为何无法读取?
GDB无法读取云端共享对象调试符号的问题
问题背景
本地开发的程序上传至DigitalOcean云端服务器后,GDB无法读取共享对象的调试符号,无法显示源代码行,但本地调试正常,且本地与云端编译方式完全一致。
程序架构:C封装器调用NASM编写的共享对象,多个C目标文件链接至该共享对象,所有文件均使用-g或-ggdb编译/汇编,其中NASM汇编命令为nasm -f elf64 -g -F dwarf Calc_XYZ.asm,该配置已稳定使用5年。
环境对比
- 本地环境:Ubuntu 20.04、NASM 2.14.02、GDB 9.2、GCC 9.4.0
- 云端环境:Ubuntu 22.04、NASM 2.15.05、GDB 12.1、GCC 11.4.0
关键现象
断点与源代码关联异常:云端GDB中在NASM文件设置断点后,可单步执行指令,但无法显示对应源代码行,执行
info source输出:(gdb) info source No current source file.源文件均在当前工作目录,本地执行该命令则显示正确文件。
调试信息读取差异:
- 本地
info sources可列出所有文件的调试信息; - 云端
info sources仅显示主程序文件,且提示调试信息未读取:(gdb) info sources /opt/P01_SH/_Debug_Wrappers_in_C/Call_Create_Threads_in_C-Calc.exe: (Full debug information has not yet been read for this file.)
- 本地
调试段与符号表表现矛盾:
- 云端执行
objdump --syms Calc_XYZ.so | grep debug无输出;本地则能列出.debug_aranges、.debug_info等多个调试段。 - 但
file命令显示云端的共享对象文件包含调试信息且未剥离:$ file Create_Threads_in_C-Calc_XYZ.o Create_Threads_in_C-Calc_XYZ.o: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=e230e001a6e0b4ae9dadafa66c0b26edcaf87317, with debug_info, not stripped - 云端
objdump -g Calc_XYZ.so能输出完整的DWARF调试信息,包括.debug_info、.debug_line等段内容,文件名表中也正确列出了所有相关汇编源文件。
- 云端执行
动态符号集差异:
- 本地
nm -uD输出的未定义符号均为程序自身调用的函数; - 云端
nm -uD输出的未定义符号多为系统库函数(如dlopen、__libc_start_main),未包含程序自身的函数符号。
- 本地
疑问
为何云端的共享对象文件明明包含调试符号,但GDB却无法读取,无法关联到源代码?
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

