gpt4 book ai didi

C++ - 如何找出当前线程的创建位置?

转载 作者:行者123 更新时间:2023-11-30 05:33:54 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 2010 开发一个巨大的 C++ MFC GUI 应用程序,其中包含大量我不熟悉的代码。

有一个线程被生成了太多次,我不确定它在哪里被生成,因为有很多代码生成这个线程。此外,同一线程的代码中有许多创建点。我需要找到哪个创建点启动了当前线程函数。

如何在 Visual Studio 中找到创建线程的位置?

注意:我在调用堆栈窗口中看不到线程是在哪里创建的。

最佳答案

如果可能的话,为一个用于创建线程的函数做一个宏定义,然后一旦它被创建,在一些映射中存储线程 ID/句柄,它将包含类型对:[ThreadID] -> [ __FILE__+__LINE__]。这将允许您检查线程内部的创建位置。

更高级的方法是使用 api Hook ,但那需要大量的编码。因此,您可以使用 http://codefromthe70s.org/mhook22.aspx 的 api Hook 并 Hook CreateThread。当您的自定义 CreateThread 函数被执行时,您可以执行原始 CreateThread 并使用其返回的句柄更新 map ,如第一段所示。问题是您必须存储调用堆栈数据才能找到执行此调用的位置。你可以使用 http://www.codeproject.com/Articles/11132/Walking-the-callstack为了那个原因。

即使使用第一个解决方案,您可能会发现 __FILE__+__LINE__ 没有为您提供足够的信息,并且必须调用堆栈。


我用 mhook 制作了一个小型测试应用程序 - 下面是一些可能有用的代码:

typedef HANDLE(WINAPI *CreateThread_t)(LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD);
CreateThread_t fCreateThread = (CreateThread_t)GetProcAddress(LoadLibrary(L"Kernel32.dll"), "CreateThread");

HANDLE
WINAPI
MyCreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ __drv_aliasesMem LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
)
{
HANDLE hret = fCreateThread(lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);
// Here you can add thread entry for hret with current callstack.
// You will probably want to create this thread suspended, to make
// sure it wont get executed before map gets updated. Resume it after
// map update.
//if (lpStartAddress == MyThreadProcToMonitor) {
// log things
//}
return hret;
}

int main() {
// This will hook create thread
Mhook_SetHook((PVOID*)&fCreateThread, MyCreateThread);

// App logic here

Mhook_Unhook((PVOID*)&fCreateThread);
}

关于C++ - 如何找出当前线程的创建位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com