树莓派4上GDB始终跳过断点问题求助
树莓派4上GDB无法命中断点问题排查
原问题
在运行Raspberry Pi OS的树莓派4上调试C++代码时,GDB无法命中main断点,程序直接运行至结束。操作步骤及输出如下:
编译命令:
g++ -g brainfuck.cpp -o brainfuck -O0
GDB操作及输出:
gdb brainfuck # 内部操作 break main # 输出:Breakpoint 1 at 0xd74: file brainfuck.cpp, line 49. run # 输出: # Starting program: /home/deca/Programming/Cpp/brainfuck # Now SP is 3During startup program exited normally.
确认断点已设置:
(gdb) info breakpoint Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000000d74 in main(int, char**) at brainfuck.cpp:49
已尝试的解决方法
- 通过包管理器卸载并重新安装GDB
- 执行
set breakpoint auto-hw off关闭硬件断点自动设置 - 使用编译参数
-O0 -g -ggdb -fno-omit-frame-pointer -gcolumn-info编译代码 - 编写Hello World程序测试断点功能
- 以root身份运行GDB
- 在
_start处设置断点(b _start) - 从源码编译GDB 13.1版本
在Hello World示例上执行strace -f -o syscall.txt gdb ./helloworld得到关键错误:
warning: Could not trace the inferior process. warning: ptrace: Operation not permitted During startup program exited with code 127.
编辑补充
已替换为Hello World示例代码(如下),并生成目标文件转储、readelf -a输出信息。即使编译最新GDB 13.1版本,问题仍存在,推测是系统配置或GDB依赖组件问题。
Hello World示例代码:
#include <stdio.h> int main(int argsc, char* argv[]) { printf("Hello World\n"); return 0; }
版本信息
- g++ (Debian 10.2.1-6) 10.2.1 20210110
- GNU gdb (Debian 10.1-1.7) 10.1.90.20210103-git
- Linux raspberrypi 5.15.84-v8+
- 系统版本:Debian GNU/Linux 11 (bullseye)
问题原因及解决方案
核心原因
从strace输出的ptrace: Operation not permitted可以确定,问题源于系统ptrace权限限制。Debian 11及基于它的Raspberry Pi OS默认启用了kernel.yama.ptrace_scope=1的安全配置,禁止非父进程的ptrace操作,而GDB需要通过ptrace来控制和调试目标程序。
解决方案
临时生效(重启后失效)
执行以下命令关闭ptrace限制:sudo sysctl -w kernel.yama.ptrace_scope=0永久生效
编辑/etc/sysctl.d/10-ptrace.conf文件:sudo nano /etc/sysctl.d/10-ptrace.conf将其中的
kernel.yama.ptrace_scope = 1修改为kernel.yama.ptrace_scope = 0,保存后执行以下命令使配置生效:sudo sysctl --system验证
重新运行GDB调试Hello World程序,设置main断点后执行run,此时应该能正常命中断点。
内容的提问来源于stack exchange,提问作者decabytes
相关产品推荐
相关产品推荐

