2015-12-30 22 views
0

我正在使用Visual Studio 2010的一个巨大的C++ MFC GUI应用程序,它有很多我不熟悉的代码。C++ - 如何找出当前线程创建的位置?

有是一个的被催生了太多的时间一个线程,我不知道在那里它被作为催生有很多会派生这个线程的代码。而且,同一个线程的代码中有许多创建点。我需要找到哪个创建点启动了当前的线程函数。

我怎样才能找到在Visual Studio中创建线程的位置?

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

+0

你所说的“相同”的线程是什么意思?有问题的线程的独特属性是什么? – SergeyA

+0

对不起,我的意思是相同的线程ID不是相同的线程。 – taha

+0

尝试找到线程'pid'。它可能有助于找到线程的来源。 – roottraveller

回答

0

如果允许您稍微更改一些代码,您可以用一个宏来代替线程启动调用,该宏还会记录__FILE____LINE__和线程ID,以便您可以跟踪启动。

1

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

更高级的aproach是使用api钩子,但那是很多编码。所以你可以使用API​​挂钩http://codefromthe70s.org/mhook22.aspx并挂钩CreateThread。当您的自定义CreateThread函数被执行时,您可以执行原始CreateThread并使用其返回的句柄更新第一段的地图。问题在于,您将不得不存储调用堆栈数据以查找执行此调用的位置。你可以使用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); 
}