You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键现象

  1. 断点与源代码关联异常:云端GDB中在NASM文件设置断点后,可单步执行指令,但无法显示对应源代码行,执行info source输出:

    (gdb) info source
    No current source file.
    

    源文件均在当前工作目录,本地执行该命令则显示正确文件。

  2. 调试信息读取差异:

    • 本地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.)
      
  3. 调试段与符号表表现矛盾:

    • 云端执行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等段内容,文件名表中也正确列出了所有相关汇编源文件。
  4. 动态符号集差异:

    • 本地nm -uD输出的未定义符号均为程序自身调用的函数;
    • 云端nm -uD输出的未定义符号多为系统库函数(如dlopen、__libc_start_main),未包含程序自身的函数符号。

疑问

为何云端的共享对象文件明明包含调试符号,但GDB却无法读取,无法关联到源代码?


内容的提问来源于stack exchange,提问作者RTC222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:15:56