setcap导致Qt Creator无法附加调试进程的问题求助
Qt Creator调试带capabilities的C++程序时的ptrace错误解决
问题描述
调试C++代码时遇到如下错误:
ptrace: Operation not permitted.
Could not attach to the process. Make sure no other debugger traces this process. If your uid matches the uid of the target process, check the settings of /proc/sys/kernel/yama/ptrace_scope For more details, see /etc/sysctl.d/10-ptrace.conf
为调用第三方库函数,通过CMake给可执行文件添加了capabilities,自定义命令如下:
add_custom_command( TARGET TARGNAME POST_BUILD COMMAND echo PW | sudo --stdin setcap CAP_DAC_OVERRIDE,CAP_IPC_OWNER,CAP_SYS_RAWIO=ep TARGOUTNAME WORKING_DIRECTORY $<TARGET_PROPERTY:iVn,RUNTIME_OUTPUT_DIRECTORY> VERBATIM )
出现两种矛盾现象:
- 选择「启动项目调试」时无ptrace错误,但第三方库调用失败
- 选择「附加调试器到已运行进程」时触发上述ptrace错误,且常规解决方案无效
核心原因
可执行文件添加capabilities后,进程权限属性改变导致调试器无法正常附加;而Qt Creator启动调试时,默认流程可能未正确保留capabilities,进而引发第三方库调用失败。
解决步骤
1. 临时调整ptrace_scope(立即生效,重启失效)
执行命令:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
2. 永久设置ptrace_scope
编辑配置文件:
sudo nano /etc/sysctl.d/10-ptrace.conf
将kernel.yama.ptrace_scope的值改为0,保存后执行以下命令生效:
sudo sysctl -p /etc/sysctl.d/10-ptrace.conf
3. 赋予调试器附加权限
给gdb添加CAP_SYS_PTRACE权限,使其能附加到带capabilities的进程:
sudo setcap CAP_SYS_PTRACE=ep /usr/bin/gdb
(若使用LLDB,替换路径为/usr/bin/lldb执行相同命令)
4. 确保调试启动时capabilities生效
修改Qt Creator运行配置:
- 打开「项目」->「运行」配置
- 在「运行环境」中,取消勾选「使用终端运行」;或直接修改启动命令为:
sudo setcap CAP_DAC_OVERRIDE,CAP_IPC_OWNER,CAP_SYS_RAWIO=ep ./TARGOUTNAME && ./TARGOUTNAME
5. 替代方案:sudo启动调试
若上述方法无效,将启动命令改为:
sudo ./TARGOUTNAME
调试时输入sudo密码,以root权限运行进程,同时满足权限要求与调试需求。
内容的提问来源于stack exchange,提问作者sbell
相关产品推荐
相关产品推荐

