【发布时间】:2017-10-09 08:06:24
【问题描述】:
我很难理解下面的调用堆栈。
ntdll!NtCreateThreadEx+0xc
KERNELBASE!CreateRemoteThreadEx+0x1f0
kernel32!CreateThreadStub+0x27
MyModule!_beginthreadex+0x87
很抱歉,由于专有问题,我无法透露更多信息,但我相信我们应该能够至少部分理解这一点。那是我正在查看的崩溃转储中第三方库生成的线程的状态。 (线程本身与我正在调查的问题无关。)
什么情况可能导致对 _beginthreadex 的调用最终进入 CreateRemoteThread? API 的 MSDN 文档没有给我任何线索(“远程”这个词甚至没有出现在那个页面上。)
我有第三方库的符号,调用堆栈绝对是合法的。
更新:
有趣。如果我从CreateThreadStub 应该返回的位置向后拆卸,我会看到以下说明:
call dword ptr [MyModule!_imp__CreateThread (573701a0)]
cmp eax,ebx
当我这样做时:
0:048> dds MyModule!_imp__CreateThread l1
573701a0 75b5cf30 kernel32!CreateThreadStub
当我反汇编 CreateThreadStub 时,我确实看到它在调用 CreateRemoteThread。这一切都非常令人困惑!
【问题讨论】:
-
这是创建线程的绝对常用堆栈。 CreateRemoteThread[Ex] 在创建线程时总是被调用。
-
@RbMm 真的吗?我一直以为 CreateRemoteThread 在一个不同的进程的地址空间中创建了一个线程?
-
是的,真的。 CreateRemoteThread[Ex] 总是在您调用 CreateThread 或 _beginthreadex 时出现。你问
What condition can possibly cause- 这是无条件的。 总是 -
@RbMm 谢谢!我不怕承认我从来不知道!我想我应该删除这个问题。
标签: multithreading winapi windbg callstack