有没有办法告诉gdb等待进程启动并附加到它?

Nat*_*man 33 gdb

我有一个由另一个进程调用的进程,由另一个进程调用,等等.这是一个长工具链中的子进程.

这个过程正在崩溃.

我想在gdb中捕获这个过程,以了解它崩溃的原因.但是,我能想到的唯一方法是:

  1. 在命令行中启动原始父进程.
  2. 轮询ps -C <name process I want to catch>并获得PID.
  3. 启动gdb,附加到该进程的PID.

这很麻烦但通常可以胜任.问题是当前的故障运行得非常快,当我捕获PID并启动gdb时,它已经通过了故障点.

我想启动gdb而不是:

(gdb) attach <pid>
Run Code Online (Sandbox Code Playgroud)

我想要做:

(gdb) attach <process name when it launches>
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?


我在linux上使用gdb 7.1

fch*_*hen 22

这是我的脚本名为gdbwait:

#!/bin/sh
progstr=$1
progpid=`pgrep -o $progstr`
while [ "$progpid" = "" ]; do
  progpid=`pgrep -o $progstr`
done
gdb -ex continue -p $progpid
Run Code Online (Sandbox Code Playgroud)

用法:

gdbwait my_program
Run Code Online (Sandbox Code Playgroud)

当然它可以更好地编写,但Bourne shell脚本语法对我来说是痛苦的,所以如果它有效,那么我就不管它了.:)如果新进程启动并且死得太快,请在自己的程序中添加1秒延迟进行调试...


Joe*_*orn 8

在Mac OS X上,您可以使用:

(gdb) attach --waitfor <process-name>
Run Code Online (Sandbox Code Playgroud)

但是这有时也无法捕获很快退出的进程.我不确定这是否在任何其他平台上都受支持.

适用于Mac OS X v10.5 WWDC Seed的GDB发行说明

  • 使用gdb-apple:sudo port install gdb-apple (2认同)

ks1*_*322 5

您可以附加到父进程并设置follow-fork-mode子进程.这将使分叉后的gdb调试子进程而不是父进程.此外抓叉将是有益的.这将使gdb在每个fork之后停止.查看文档.