Linux 为什么gdb需要root权限来调试用户程序?

Linux 为什么gdb需要root权限来调试用户程序?,linux,gdb,Linux,Gdb,我已经成功地使用gdb有一段时间了,但我最近升级了我的Ubuntu版本,现在看来,如果我以root用户身份运行,我只能让gdb成功运行我的程序。就是 ~ % gdb -q sleep -ex 'run 60' Reading symbols from /bin/sleep...(no debugging symbols found)...done. Starting program: /bin/sleep 60 tcsh: Permission denied. During startup p

我已经成功地使用gdb有一段时间了,但我最近升级了我的Ubuntu版本,现在看来,如果我以root用户身份运行,我只能让gdb成功运行我的程序。就是

~ %  gdb -q sleep -ex 'run 60'
Reading symbols from /bin/sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
tcsh: Permission denied.
During startup program exited with code 1.
(gdb)
失败,而

~ %  sudo gdb -q sleep -ex 'run 60'
Reading symbols from /bin/sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
Running .tcshrc
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7adada0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:82
82  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb)
工作。一个线索是,在第一种情况下,gdb启动程序不运行my.tcshrc文件,而在第二种情况下,它运行my.tcshrc文件

这似乎是一个简单的权限问题,我必须在某个时候修复它,因为在过去,我从未需要以root用户身份运行gdb。然而,在谷歌搜索了很多次之后,我无法找到我可能已经做了什么(如果我真的做了什么的话)。一个可能的解决方案-设置-似乎不起作用


是否需要做些什么来允许gdb在没有root权限的情况下运行程序?我知道在OSX中,gdb必须进行代码设计。Ubuntu/Linux有类似的功能吗

以下是调试gdb问题的一些想法。这些评论对于这些事情来说是不可行的,所以我把它们放进了一个答案中

尝试
-n
选项以确保未加载初始化文件

使用
echo
程序而不是
sleep 60
来简化调试(示例中的SIGINT可能特定于sleep程序)

运行
gdb-batch
,并将其余部分放入
~/.gdbinit

file /bin/echo
run
添加
上设置详细信息


完成后不要忘记清理
~/.gdbinit

这不是一个完整的答案,但事情变得越来越清楚。上面的提示非常有用。我创建了以下
.gdbinit
文件

show environment SHELL file /bin/echo run 'Goodbye' 取消设置shell变量将起作用:

~ % unsetenv SHELL ~ % gdb -q -batch Environment variable "SHELL" not defined. Goodbye [Inferior 1 (process 6992) exited normally] 奇怪的是,“无可加载节”错误只有在显式设置shell变量时才会发生。另一个谜

为什么
/bin/tcsh
不起作用仍然令人困惑。就我而言,
/bin/tcsh
上的权限是

~ % ls -lh /bin/tcsh lrwxrwxrwx 1 root root 13 Oct 14 2011 /bin/tcsh -> /usr/bin/tcsh ~ % ls -lh /usr/bin/tcsh -rwxr-xr-x 1 root root 382K Oct 14 2011 /usr/bin/tcsh ~%ls-lh/bin/tcsh lrwxrwx 1根根目录2011年10月14日13/bin/tcsh->/usr/bin/tcsh ~%ls-lh/usr/bin/tcsh -rwxr-xr-x 1根根目录382K 2011年10月14日/usr/bin/tcsh
问题也可能是我的
.tcshrc
文件中的某些内容导致shell在此非交互模式下崩溃。

我将登录shell更改为bash,gdb不再需要root权限进行调试。以下是最新的:

我的
.gdbinit
文件:

(bash) ~ % more .gdbinit show environment SHELL file /bin/echo run 'running .gdbinit' (bash) ~ %
我仍然不明白为什么tcsh不起作用,我很想知道。因此,如果有人有可能的解释,请发表评论。

我也有同样的问题,原因是有人在gdb可执行文件中设置了粘性位:

cruiz> ls -l /usr/bin/gdb

-rwsr-sr-x 1 root root 4190760 2010-05-05 07:55 /usr/bin/gdb*
我更改了它(
chmod755/usr/bin/gdb
),现在它可以工作了

之前:

cruiz> gdb
...

(gdb) shell

csh: Permission denied.
更改后:

cruiz> gdb

(gdb) shell

cruiz> 

检查您的程序是否具有可执行权限

ls -l .
-rw-r--r-- 1 opt opt 30010 Aug 16 16:13 test

调试时可能会出现类似“test”的情况。

我通过launchcomplete命令在launch.json文件中指定了Linux

MS有3种不同的方式来指定CPU…Windows、Linux或OSx


在我的launch.json文件中,此LaunchCompleteCommand部分粘贴在setupCommands部分之后。

我使用上面的系统命令“sleep”来说明我在自己的代码中看到的行为。因此,我不认为sleep是root所有的这一事实是一个问题。您是否检查或修改了.tcshr的权限?它为什么还要运行tcsh?我我检查了.tcshrc上的权限,并将其更改为root-这没有帮助。至于gdb为什么运行tcsh,我不知道。这对我来说非常神秘。我不想以root身份运行gdb,所以我很想知道发生了什么变化。我上面给出的示例在OSX下没有问题,所以问题不是真正的权限问题gdb所做的一切都是
execve(“/bin/tcsh”、[“/bin/tcsh”、“-c”、“exec/bin/sleep 60”])
.tcsh将尝试运行
/etc/csh.cshrc
~/.tcshrc
~/.cshrc
,因此其中任何一个都可能会导致问题。我会检查是否有命令试图读取或写入您无权访问的文件。谢谢。我不确定问题是什么,但我重新安装了tcsh,检查了.tcshrc permissions,重新启动,现在一切正常。我的.tcshrc文件中没有任何更改,因此无法指出任何可疑的调用,这可能是问题所在。在这一过程中,我发现了一些很酷的gdb功能/技巧,因此没有丢失所有功能。无论如何,我可能会坚持使用bash,因为我使用的是is(通过从命令行启动bash)获取git提示。我猜后者是正确的:被拒绝的权限错误来自tcsh尝试执行的内容,而不是tcsh本身的执行。应该很容易找到,但为什么要麻烦呢?或者,tcsh正在尝试做gdb不允许它做的事情。我应该补充一点,我安装了tcsh,并且在没有.tc的情况下运行shrc文件(我移动了它),权限被拒绝的问题仍然是个谜。我的设置很有趣-我只希望我能弄清楚tcsh试图运行的是什么,而它没有运行权限(gdb是root)。更新:I re=installed tcsh(没有任何更改),选中(再次)对.tcshrc的权限,重启,瞧,tcsh和gdb都很好。仍然不知道发生了什么。但我学到了以下几点:(1)gdb调用shell,(2)shell变量不是通过从命令行简单地调用“tcsh”或“bash”自动设置的(只有当shell作为登录shell启动时)。所以一切都不会丢失。
cruiz> gdb
...

(gdb) shell

csh: Permission denied.
cruiz> gdb

(gdb) shell

cruiz> 
ls -l .
-rw-r--r-- 1 opt opt 30010 Aug 16 16:13 test
    "launchCompleteCommand": "exec-run",
      "linux": {
        "MIMode": "gdb",
        "miDebuggerPath": "/usr/bin/gdb"
      },