...или "Откуда С++ дебаггер берет информацию для графы "Location" в окошке "Threads"" Здравствуйте! Есть задача: узнать, какие подпрограммы выполняют все треды текущщего процесса. Используя tlhelp32, написал такой код: Код (Text): THREADENTRY32 threadEntry; memset (&threadEntry, 0, sizeof (THREADENTRY32)); threadEntry.dwSize = sizeof (THREADENTRY32); HANDLE hSnapShot = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0); if ((hSnapShot != INVALID_HANDLE_VALUE) && (Thread32First (hSnapShot, &threadEntry))) { DWORD currPId = GetCurrentProcessId (); DWORD currTId = GetCurrentThreadId (); do { if (threadEntry.th32OwnerProcessID == currPId) { // в threadEntry лежит инфа про текущщий тред int z = 0; } } while (Thread32Next (hSnapShot, &threadEntry)); } CloseToolhelp32Snapshot (hSnapShot); THREADENTRY32 имеет такие поля: Код (Text): typedef struct tagTHREADENTRY32{ DWORD dwSize; DWORD cntUsage; DWORD th32ThreadID; DWORD th32OwnerProcessID; LONG tpBasePri; LONG tpDeltaPri; DWORD dwFlags; DWORD th32AccessKey; DWORD th32CurrentProcessID; } THREADENTRY32; но не имеет "CurrentAddress" или чего-то похожего(( Можно ли у винды узнать про этот тред чего-нибудь подробнее, используя например его th32ThreadID ? Си-шный дебаггер же узнаёт... Спасибо всем ответившим.
С отладчиком все просто, т.к. ему по WaitForDebugEvent передаются соотв. структуры CREATE_PROCESS_DEBUG_INFO и CREATE_THREAD_DEBUG_INFO, содержащие lpStartAddress
leo А кто ему их передает? Сама программа, или он-таки лезет через виндовые функции к ее структурам и выдает их внутренности? Отладчик же может показывать другие потоки, "застывшие" на выполнении всяких расчетов, а не на WaitForSomething
Asmodaeous Через WaitForDebugEvent винда информирует отладчик о создании\закрытии процесса и каждого из его потоков (кроме основного, инфа о котором передается вместе с инфой о процессе), о загрузке\выгрузке каждой из dll и обо всех исключениях, возникающих в программе. Поэтому отладчик только и делает, что крутит в цикле WaitForDebugEvent и обрабатывает собой же организованные исключения int1 и int3 PS: если лезть в native апи, то можно заюзать NtGetInformationThread для получения стартового адреса, а если нужен "хоть какой" примерный адрес, то можно и по GetThreadContext
Asmodaeous Надеюсь ты понимаешь, что GetThreadContext может выдать адрес не только внутри ThreadProc, но и в любой системной dll в зависимости от того, где будет находится поток в момент вызова. А упомянутый тобой дебаггер все таки выдает не текущий, а стартовый адрес потока (EntryPoint для основного и ThreadProc для прочих)
blast А какой .h надо включать в проект? А то у меня на Embedded VC 4 не компилится(( leo Извините??.. А вот если такую программу тормозить на строчке Sleep(0) и смотреть в дебаггере инфу о других трех потоках этого процесса, то адрес , который они выполняют, часто будет разным)) Код (Text): DWORD WINAPI NewThreadRoutine (LPVOID lpParameter) { int z; while (1) { z += 1; z += 2; z += 3; } return 0; } /////////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { for (int i = 0; i < 3; i++) { HANDLE h = CreateThread(NULL, NULL, NewThreadRoutine, 0, CREATE_SUSPENDED, NULL); ResumeThread (h); } while (1) Sleep (0); return 0; } Что адрес может находиться не только в выполняемой программе - конечно понимаю))