64位系统中用GDB调试32位可执行文件的问题
32位Ubuntu 18.04下GDB调试__libc_start_main看不到源码的解决办法
1. 安装32位glibc调试符号包
Ubuntu默认的32位glibc库不带调试符号,必须单独安装:
sudo apt update sudo apt install libc6-dbg:i386
2. 确认源码与系统glibc版本匹配
你使用的glibc-2.27源码刚好匹配Ubuntu 18.04的默认glibc版本,只需确认glibc-2.27/csu/libc-start.c文件存在即可。
3. 重新编译32位测试程序
添加-O0关闭优化,避免调试时源码与汇编错位:
gcc -m32 -g -O0 -o test test.c
4. 正确执行GDB调试流程
启动GDB后按以下步骤操作:
gdb -q test
设置glibc源码路径:
dir /home/nick/c_programs/x86/glibc-2.27/csu
设置断点(选择pending,因为__libc_start_main在共享库中,启动前无法解析完整符号):
br __libc_start_main
当GDB提示Function "__libc_start_main" not defined. Make breakpoint pending on future shared library load? (y or [n])时,输入y。
运行程序:
run nikos
此时GDB应该会停在libc-start.c的对应源码行,和你64位调试时的效果一致。
额外排查步骤(如果仍不显示源码)
- 执行
info sharedlibrary查看libc.so.6是否已加载调试符号(标记为Yes)。 - 手动指定调试符号路径:
set debug-file-directory /usr/lib/debug
内容的提问来源于stack exchange,提问作者Nick_h
相关产品推荐
相关产品推荐

