【问题标题】:Can I use GDB to debug a running process?我可以使用 GDB 调试正在运行的进程吗?
【发布时间】:2011-01-19 12:02:18
【问题描述】:

在linux下,可以使用GDB调试当前正在运行的进程吗?

【问题讨论】:

    标签: linux debugging gdb


    【解决方案1】:

    最简单的方法是提供进程ID

    gdb -p `pidof your_running_program_name`
    

    请在man gdb 命令中获取完整的选项列表。

    如果同一个程序有多个进程在运行,那么下面的命令会列出这些进程。

    ps -C program -o pid h
    <number>
    

    那么输出的进程id(数字)可以作为gdb的参数。

    gdb -p <process id>
    

    【讨论】:

      【解决方案2】:

      是的。使用attach 命令。查看this link 了解更多信息。在 GDB 控制台输入 help attach 会得到以下信息:

      (gdb) help attach
      

      附加到 GDB 之外的进程或文件。 此命令附加到另一个目标,与您上次的类型相同 “target”命令(“info files”将显示您的目标堆栈)。 该命令可以将进程 ID、进程名称作为参数 (以可选的 process-id 作为后缀)或设备文件。 对于进程 ID,您必须有权向进程发送信号, 并且它必须具有与调试器相同的有效 uid。 当对现有进程使用“attach”时,调试器会发现 进程中运行的程序,首先在当前工作中查找 目录,或者(如果没有找到)使用源文件搜索路径 (参见“directory”命令)。您也可以使用“file”命令 指定程序,并加载其符号表。


      注意:由于improved security in the Linux kernel,您可能难以附加到进程 - 例如从另一个 shell 附加到一个 shell 的子级。

      您可能需要根据您的要求设置/proc/sys/kernel/yama/ptrace_scope。许多系统现在默认为1 或更高版本。

      The sysctl settings (writable only with CAP_SYS_PTRACE) are:
      
      0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
          process running under the same uid, as long as it is dumpable (i.e.
          did not transition uids, start privileged, or have called
          prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
          unchanged.
      
      1 - restricted ptrace: a process must have a predefined relationship
          with the inferior it wants to call PTRACE_ATTACH on. By default,
          this relationship is that of only its descendants when the above
          classic criteria is also met. To change the relationship, an
          inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
          an allowed debugger PID to call PTRACE_ATTACH on the inferior.
          Using PTRACE_TRACEME is unchanged.
      
      2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
          with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.
      
      3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
          PTRACE_TRACEME. Once set, this sysctl value cannot be changed.
      

      【讨论】:

      • 链接已损坏 :( 从我的角度来看,我喜欢 this one 来自 J. Polfer 的答案。干杯 ;)
      • 我已经修复了链接。
      • 这是否也适用于远程目标上进程的 pid?
      • 你必须在远程目标上运行一个调试服务器;之后应该是一样的。
      • 可以使用echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope更改标志。
      【解决方案3】:

      如果要附加一个进程,该进程必须具有相同的所有者。 root 可以附加到任何进程。

      【讨论】:

        【解决方案4】:

        ps -elf 似乎没有显示 PID。 我建议改用:

        ps -ld | grep foo
        gdb -p PID
        

        【讨论】:

          【解决方案5】:

          是的,你可以。假设一个进程foo 正在运行...

          ps-精灵 | grep 富 查找PID号 gdb -a {PID 编号}

          【讨论】:

          • 您在哪个发行版上运行?使用最新版本的 Fedora,“gdb -a”会打印“option -a is ambiguous”错误。
          • 官方参数是-p/--pid
          【解决方案6】:

          是的。你可以这样做:

          gdb program_name program_pid
          

          快捷方式是(假设只有一个实例正在运行):

          gdb program_name `pidof program_name`
          

          【讨论】:

          • 我不知道那是做什么的,但它肯定对我不起作用。它说 不存在。
          • 我发现这种方法效果最好,因为它除了附加到进程之外还加载了符号表。应该注意的是,program_name 如果您与二进制文件位于同一目录中,则可以使用。我认为如果您在不同的目录中,二进制文件的路径会起作用。
          • 你没有忘记program_id前面的-p吗?此外,可能需要使用 sudo 运行 gdb 以附加到正在运行的进程。
          • 无法撤回我的投票。
          【解决方案7】:

          您可以使用gdb -p PID 附加到正在运行的进程。

          【讨论】:

            【解决方案8】:

            要使用的命令是 gdb attach pid,其中 pid 是您要附加到的进程的进程 ID。

            【讨论】:

              猜你喜欢
              • 2013-04-16
              • 1970-01-01
              • 1970-01-01
              • 2021-02-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-08
              • 2011-07-09
              相关资源
              最近更新 更多