假设某个进程调试另一个进程(通过调用DebugActiveProcess())。
然后一些其他进程/线程在该调试进程中生成断点异常(通过调用DebugBreakProcess())。 然后调试器接收此EXCEPTION_DEBUG_EVENT-> EXCEPTION_BREAKPOINT事件,并且在DEBUG_EVENT结构中,字段 dwThreadId 将保留一些ID。
我的根本问题是 - dwThreadId 代表什么? (MSDN说它是“调试事件发生的线程的标识符”)。
我的担忧如下:
调试事件发生的意义是什么?难道不是这个过程的所有线程都以这种方式发出信号,因此该过程完全被阻止了吗?
此外,根据我读到的内容,这种机制的工作原理如下:
DebugBreakProcess()API通过在目标进程中创建一个线程来调用断点指令,这会导致正常的SEH机制接管。
这意味着这个dwThreadId实际上可能是这个新创建的线程的ID,而不是任何原始进程'线程的ID。我是对的吗?
如果调试过程是多线程的(实际上几乎可以肯定),该怎么办? 这是调用DebugBreakProcess()API时“在处理器中”的线程的ID吗?
更新:所有这一块都得到了解答。见第一个答案。
非常感谢您提供的任何帮助。
答案 0 :(得分:0)
你几乎回答了你自己的问题,那就是调用DebugBreak()
的线程,而DebugBreakProcess()
又是由{{1}}创建的新线程。