使用GDB watchpoint时程序无响应问题求助
问题复现
执行watch var设置硬件观察点后,启动run命令,GDB仅输出Starting program: blah blah就完全无响应,等待数分钟仍无进展;按下Ctrl-C终止时,出现如下错误:
dl_new_hash (s=0xf7e189d4 "0EE24_M_initialize_moneypunctEP15__locale_structPKc") at dl-lookup.c:577 577 dl-lookup.c: No such file or directory.
常规断点功能正常,仅硬件观察点异常,使用的GDB版本为:
$ gdb --version GNU gdb (GDB) Red Hat Enterprise Linux 8.2-18.el8 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
排查与解决步骤
检查硬件观察点资源
CPU的硬件观察点数量有限(通常2-4个),如果已设置多个观察点,先执行delete watchpoints清空所有观察点,仅设置目标变量的观察点后重新运行程序。可通过info watchpoints查看当前已设置的观察点数量。强制使用软件观察点
硬件观察点出现兼容性问题时,切换为软件观察点规避:watch -s var软件观察点通过GDB主动扫描内存实现,虽然效率低于硬件观察点,但能避开硬件与动态链接库的交互bug。
补充动态链接库调试信息
报错中缺失的dl-lookup.c属于glibc动态链接库的调试文件,安装对应调试包修复:sudo dnf install glibc-debuginfo glibc-debuginfo-common安装完成后重新启动GDB,可解决调试信息缺失导致的异常卡住问题,同时能定位到更详细的错误位置。
升级GDB版本
RHEL8自带的GDB 8.2存在已知的硬件观察点与动态链接库交互的bug,通过devtoolset升级到更高版本:sudo dnf install devtoolset-11-gdb scl enable devtoolset-11 bash切换到新版GDB后重新测试观察点功能。
排查动态链接加载过程
在GDB中启用共享库加载时暂停的功能,逐步排查加载阶段的异常:set stop-on-solib-events 1 run程序会在每个共享库加载时停下,可通过
continue逐步执行,定位到触发卡住的库加载环节。同时用ldd ./your_program检查程序依赖的共享库是否存在损坏或版本不匹配情况。
内容的提问来源于stack exchange,提问作者k huang

