3

一定要快~怎么在程序启动的时候attach

 2 years ago
source link: https://zhuanlan.zhihu.com/p/463771219
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一定要快~怎么在程序启动的时候attach

CrackingOysters——源于编程珠玑,公众号同名

有时候在调试程序,bug是在程序开始的时候就出现了,往往用调试器attach的时候,程序已经跑过了有问题的地方。这时候怎么办呢?

最近我就遇到了这样一个问题。下面介绍我解决问题的办法。本文以gdb为例。

在调试器内启动程序

要达到程序一开始的时候就已经在调试状态,那么我们可以在调试器内启动程序,

首先使用gdb <exe>启动gdb,接着打好相应的断点。然后通过输入run 运行程序。

如果程序需要参数,那么直接放在run后面就可以了。

那么问题似乎解决了。

然而没有,我遇到的问题是——要调试的程序是主程序生成的一个子进程。

gdb默认调试父进程。有一个模式可以跟踪子进程,但是因为我的主程序生成了好多子进程,这样跟踪有些不可行。

怎么办呢?

简单的脚本,解决大的问题

跳过脚本来解决!

我们可以写一个简单的bash 脚本,不停地查询是否符合某个特征的进程出现,如果出现了,马上使用gdb进行attach.

# func
function get_pid() 
{ 
        ps -ef | grep -v grep | grep <pattern> | awk '{print $2}' 
} 

# while loop
proc_pid=''
while [ -z "$proc_pid" ]
do
proc_pid=$(get_pid)
done;    /usr/local/bin/gdb -p $proc_pid -q -x /dev/scripts/watch_ref.py

脚本很简单,首先定义一个获取符合某个pattern的pid的函数,接着一个循环不停地查询pid,如果不存在就继续插叙,如果存在了就使用gdb来attach。

不知道为什么,如果我直接把上面的代码放在文件里面,运行总是不行,只能单独复制粘贴到shell里面运行。

这样是不是够快了!?

理论上可能不能覆盖100%的case,但是经过我的实践证明,它解决了我所有的case,这里贴出来,也方便我以后继续使用。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK