我正在使用Visual Studio 2010的一個巨大的C++ MFC GUI應用程序,它有很多我不熟悉的代碼。C++ - 如何找出當前線程創建的位置?
有是一個的被催生了太多的時間一個線程,我不知道在那裏它被作爲催生有很多會派生這個線程的代碼。而且,同一個線程的代碼中有許多創建點。我需要找到哪個創建點啓動了當前的線程函數。
我怎樣才能找到在Visual Studio中創建線程的位置?
注意:我看不到線程在調用堆棧窗口中創建的位置。
我正在使用Visual Studio 2010的一個巨大的C++ MFC GUI應用程序,它有很多我不熟悉的代碼。C++ - 如何找出當前線程創建的位置?
有是一個的被催生了太多的時間一個線程,我不知道在那裏它被作爲催生有很多會派生這個線程的代碼。而且,同一個線程的代碼中有許多創建點。我需要找到哪個創建點啓動了當前的線程函數。
我怎樣才能找到在Visual Studio中創建線程的位置?
注意:我看不到線程在調用堆棧窗口中創建的位置。
如果允許您稍微更改一些代碼,您可以用一個宏來代替線程啓動調用,該宏還會記錄__FILE__
,__LINE__
和線程ID,以便您可以跟蹤啓動。
如果可能,然後爲用於創建線程的函數創建一個宏定義,那麼一旦它創建,就會在某個映射中存儲線程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);
}
你所說的「相同」的線程是什麼意思?有問題的線程的獨特屬性是什麼? – SergeyA
對不起,我的意思是相同的線程ID不是相同的線程。 – taha
嘗試找到線程'pid'。它可能有助於找到線程的來源。 – roottraveller