2010-11-19 10 views
6

ich geöffnet habe einen Prozess öffnen (mit C++/Windows-)Gehen Stapel einen ausgetestet Prozesses

if(CreateProcessA(NULL, // No module name (use command line) 
    (LPSTR)path, //argv[1],  // Command line 
    NULL,   // Process handle not inheritable 
    NULL,   // Thread handle not inheritable 
    FALSE,   // Set handle inheritance to FALSE 
    creationFlags,    // No creation flags 
    NULL,   // Use parent's environment block 
    NULL,   // Use parent's starting directory 
    &startInfo,   // Pointer to STARTUPINFO structure 
    &processInfo)   // Pointer to PROCESS_INFORMATION structure 

wo

DWORD creationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS; 

und anschließend mit Ich versuche, es zu stackwalk

bool ok = StackWalk64(IMAGE_FILE_MACHINE_I386,m_ps.Handle ,m_th.Handle, 
    &m_stackframe, &m_threadContext, 
    0, NULL, NULL, 0); 

aber Stackwalk gibt mir nur die obere Adresse und der nächste ist 0, während ich kenne ther e sind mehr Adressen im Stapel.

Weiß jemand, was das Problem ist?
danke :)

Antwort

0

oops ... Ich habe vergessen, "ContinueDebugEvent" nach dem Empfang von Ereignissen aus dem debugged-Prozess aufzurufen - so blieb es pausiert und der StackWalk war tatsächlich korrekt. :)

0

Es ist unmöglich zu sagen, basierend auf diesem Schnipsel. Es gibt so viel, dass Sie richtig einrichten müssen, damit dies funktioniert. Überprüfen Sie die Logik unter this detailed blog post.

Veröffentlichen Sie mehr Code, wenn Sie ein größeres, aber nicht zu großes Beispiel veröffentlichen können. Wie richten Sie die Strukturen STACKFRAME und CONTEXT ein? Schwirren Sie auf StackWalk64? Jeder gegebene Aufruf gibt nur einen Stapelrahmen zurück.

+0

Ich hatte bereits das funktioniert gut, wenn ich den Prozess nur mit der "CREATE_NEW_CONSOLE" -Flag erstellt, aber jetzt muss ich Stackwalk einen Debugging-Prozess. Die Flags in "CreateProcess" sind die einzigen Unterschiede, die ich gemacht habe ... – Idov