2010-11-19 26 views
6

Tôi đang mở mở ra một quá trình (với C++/Windows) sử dụngstack Walking một quá trình sửa lỗi

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 

nơi

DWORD creationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS; 

và sau đó tôi đang cố gắng để stackwalk nó với

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

nhưng stackwalk chỉ cung cấp cho tôi địa chỉ hàng đầu và địa chỉ tiếp theo là 0, trong khi tôi biết có e là nhiều địa chỉ hơn trong ngăn xếp.

Có ai biết vấn đề là gì không?
cảm ơn :)

Trả lời

0

oops ... Tôi quên gọi "ContinueDebugEvent" sau khi nhận sự kiện từ quá trình gỡ lỗi - do đó, nó vẫn tạm dừng và StackWalk là chính xác. :)

0

Không thể nói dựa trên đoạn mã này. Có rất nhiều bạn phải thiết lập một cách chính xác để làm việc này. Kiểm tra logic tại this detailed blog post.

Đăng thêm mã nếu bạn có thể đăng mẫu lớn hơn nhưng không quá lớn. Bạn thiết lập cấu trúc STACKFRAME và CONTEXT như thế nào? Bạn đang lặp lại trên StackWalk64? Bất kỳ cuộc gọi nào chỉ trả về một khung ngăn xếp.

+0

Tôi đã làm việc này tốt khi tôi tạo quy trình chỉ với cờ "CREATE_NEW_CONSOLE", nhưng bây giờ tôi cần phải xếp chồng lên nhau một quá trình được gỡ lỗi. các cờ trong "CreateProcess" là những khác biệt duy nhất tôi đã thực hiện ... – Idov

Các vấn đề liên quan