簡體   English   中英

C ++-如何找出當前線程的創建位置?

[英]C++ - How can I find out where the current thread was created?

我正在使用Visual Studio 2010開發一個巨大的C ++ MFC GUI應用程序,其中包含大量我不熟悉的代碼。

有一個線程被產生太多次了,我不確定在哪里產生它,因為有很多代碼產生了這個線程。 同樣,在同一線程的代碼中有許多創建點。 我需要找到哪個創建點啟動了當前線程功能。

如何找到在Visual Studio中創建線程的位置?

注意:我看不到在調用堆棧窗口中創建線程的位置。

如果可能的話,請為用於創建線程的函數創建宏定義,然后在創建該函數后將線程ID /句柄存儲在某些映射中,該映射將包含成對的類型:[ThreadID]-> [ __FILE__+__LINE__ ]。 這將允許您在線程內部檢查創建它的位置。

一個更高級的方法是使用api掛鈎,但這就是很多代碼。 因此,您可以通過http://codefromthe70s.org/mhook22.aspx使用api掛鈎並掛鈎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);
}

如果允許您稍微更改代碼,則可以用一個宏替換線程啟動調用,該宏還將記錄__FILE____FILE__ __LINE__和線程ID,以便您可以跟蹤啟動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM