让程序等待调试器附加

有的时候出于一些目的,我们会希望程序等待调试器Attach上去以后才开始继续往前跑。例如,我们写了一堆console程序,同时又有个shell去调用这些console,而这个时候我们却想去调试shell运行起来的这个console。当然Windbg本身就有调试debugee子进程的功能,但是身为懒人,这种方式太麻烦。我还是更愿意加入几行代码解决这个问题。

要解决这个问题,原理上很简单。无非是程序运行初期不断的去检测本进程是否被调试,如果是就把自己断下来,如果不是继续等待。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void WaitDebuggerAttach(DWORD Second)
{
DWORD CurSec = 0;
while((!IsDebuggerPresent()) && (CurSec < Second)) {

CurSec++;
Sleep(1000);
}

if (IsDebuggerPresent()) {

__asm int 3
}
}

这个函数可以指定等待时间,如果Debugger Attach上去了,那么就断下来方便调试,否则会超时,正常执行。
这里我是用的IsDebuggerPresent这个API来获得进程的调试状态。实际上检测自己调试状态的方法很多,只不过这个用起来最方便而已。比如可以用测试断点异常的方法来检测自己的调试状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BOOL CheckForDebugger()
{
__try
{
DebugBreak();
}
__except(GetExceptionCode() == EXCEPTION_BREAKPOINT ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// No debugger is attached, so return FALSE
// and continue.
return FALSE;
}
return TRUE;
}

本Blog的第一篇文章总算是出炉了~~~我太懒了哇~

Debugging