调用DebugBreakProcess()之后 - 事件的dwThreadId代表什么?

时间:2011-12-01 22:19:34

标签: multithreading debugging winapi multicore

假设某个进程调试另一个进程(通过调用DebugActiveProcess())。

然后一些其他进程/线程在该调试进程中生成断点异常(通过调用DebugBreakProcess())。 然后调试器接收此EXCEPTION_DEBUG_EVENT-> EXCEPTION_BREAKPOINT事件,并且在DEBUG_EVENT结构中,字段 dwThreadId 将保留一些ID。

我的根本问题是 - dwThreadId 代表什么? (MSDN说它是“调试事件发生的线程的标识符”)。

我的担忧如下:


  1. 调试事件发生的意义是什么?难道不是这个过程的所有线程都以这种方式发出信号,因此该过程完全被阻止了吗?

  2. 此外,根据我读到的内容,这种机制的工作原理如下:

    DebugBreakProcess()API通过在目标进程中创建一个线程来调用断点指令,这会导致正常的SEH机制接管。

    这意味着这个dwThreadId实际上可能是这个新创建的线程的ID,而不是任何原始进程'线程的ID。我是对的吗?

  3. 如果调试过程是多线程的(实际上几乎可以肯定),该怎么办? 这是调用DebugBreakProcess()API时“在处理器中”的线程的ID吗?

  4. 更新:所有这一块都得到了解答。见第一个答案。


    1. 双核系统的情况如何,同一进程的两个线程当前并行运行?哪一个会赢,并将在此ID中说明?或者它可能导致两个不同的EXCEPTION_BREAKPOINT例外?
    2. 非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

你几乎回答了你自己的问题,那就是调用DebugBreak()的线程,而DebugBreakProcess()又是由{{1}}创建的新线程。