1.远程调试的需求
自从2015年之后,微软对linux的支持越来越完善了,使用VS进行远程linux开发也越来越好用了。VS最大的优点是调试功能强大,能极大提升发现bug的效率。
但有时候,编写的程序需要用sudo权限运行,这时候VS的调试功能无法附加至进程,提示错误!
2.环境配置
远程linux机器是ubuntu 16.04 LTS,自带gdb。
3.解决办法
3.1常规办法(很奇怪,在我的系统上失效)
错误提示也很清楚了,要么使用root账户ssh登录,要么修改ptrace的值。
使用root登录当然可以调试,但是很多时候我们没法获得root账号,另外要使用root登录,还必须给root账户配置一个密码,是比较麻烦的,也不利于后续管理(毕竟如果你把root账号的密码忘记了就有的麻烦了)。
网上有很多修改ptrace的方法,列举一下,核心思想就是让ptrace_scope的值为0。这个看/etc/sysctl.d/10-ptrace.conf的解释也就清楚了。
修改ptrace为0的操作方法:
sudo gedit /etc/sysctl.d/10-ptrace.conf
kernel.yama.ptrace_scope = 0
reboot
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
sudo sysctl -w kernel.yama.ptrace_scope=0
sysctl -p
但是!!! 此方法在我的linux上失效了!!!修改完成之后,依然无法使用VS远程调试,还是报权限不足的问题。
3.2修改gdb权限
因为VS远程调试的原理,是利用远程gdb进行的操作,于是想着在本地试试gdb,发现普通用户直接用gdb调试root程序,一样报权限不足的错误,不管ptrace是不是0。这个不知道是不是系统bug。
经过两天两夜的努力尝试,最后终于找到办法了:修改gdb的权限。还是最原始的方法最好用。
sudo chmod +s /usr/bin/gdb
修改gdb权限,改完以后状态出现‘s’。
XXX@Nuvo-3100-Series:/usr/bin$ ll gdb
-rwsr-sr-x 1 root root 6546408 6月 10 2017 gdb*
在使用VS调试中的“附加到进程”功能,可以成功调试root权限运行的程序。