2016-10-20 67 views
0

我需要啓動一個進程,然後立即將其分解,以便可以使用Visual Studio進行調試。 我在網上搜索了一些小部分後,寫了這段代碼。代碼不起作用。這個過程被啓動,但不會中斷,調用代碼會無限期地等待。如果我不以暫停模式啓動進程,它會立即運行並退出。以編程方式打破已啓動的進程

我無法修改我啓動的.exe代碼。我只有.exe和符號文件。

代碼:

#include<iostream> 
#include<Windows.h> 

using namespace std; 

int main(int argc, char **argv) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    LPWSTR commandLine; 
    int commandLength; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    if (argc != 2) 
    { 
     cout << "Usage: Launcher <commandline>" << endl; 
     return 1; 
    } 

    commandLength = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, NULL, 0); 
    commandLine = new WCHAR[commandLength]; 
    MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, commandLine, commandLength); 

    if (!CreateProcess(NULL, commandLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) 
    { 
     cout << "CreateProcess failed (" << GetLastError() << ")." << endl; 
     delete[] commandLine; 
     return 1; 
    } 

    cout << pi.dwProcessId << " " << pi.dwThreadId << endl; 

    delete[] commandLine; 

    DebugBreakProcess(pi.hProcess); 

    WaitForSingleObject(pi.hProcess, INFINITE); 

    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 

    return 0; 
} 

我在做什麼錯在這裏?

編輯:這是泰森建議後的代碼。

#include<iostream> 
#include<Windows.h> 

using namespace std; 

int main(int argc, char **argv) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    LPWSTR commandLine; 
    int commandLength; 
    HANDLE processHandle; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    if (argc != 2) 
    { 
     cout << "Usage: Launcher <commandline>" << endl; 
     return 1; 
    } 

    commandLength = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, NULL, 0); 
    commandLine = new WCHAR[commandLength]; 
    MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, commandLine, commandLength); 

    if (!CreateProcess(NULL, commandLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) 
    { 
     cout << "CreateProcess failed (" << GetLastError() << ")." << endl; 
     delete[] commandLine; 
     return 1; 
    } 

    delete[] commandLine; 

    processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId); 
    if (processHandle == NULL) 
    { 
     cout << "Could not obtain handle (" << GetLastError() << ")." << endl; 
     CloseHandle(pi.hProcess); 
     CloseHandle(pi.hThread); 
     return 2; 
    } 

    DebugActiveProcess(pi.dwProcessId); 

    //ResumeThread(pi.hThread); 

    WaitForSingleObject(pi.hProcess, INFINITE); 

    CloseHandle(processHandle); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 

    return 0; 
} 
+0

這個問題呢?你能從IInspectable的建議中獲得有用的信息嗎?其實我同意他的建議,自動啓動調試器將是一個更好的解決方法。 –

回答

0

編輯:基於更新後的代碼修改說明。

我看到三件事情會有所幫助。首先,您必須獲得正確訪問權限的流程處理。由CreateProcess返回的句柄沒有正確的訪問權限。關閉該進程句柄(pi.hProcesspi.hThread),並請求OpenProcess請求PROCESS_ALL_ACCESS。請記住,如果運行程序的用戶帳戶沒有所需的權限,則可能會失敗。

接下來,請確保您首先通過調用DebugActiveProcess以上面獲得的進程句柄啓動調試。 (這可能需要也可能不需要。)

最後,在您編輯之後,我注意到您正在等待使用WaitForSingleObject的進程句柄。這具有等待進程終止的效果。相反,請使用WaitForDebugEvent

+0

我不知道我是否正確地做了,但是我已經用新的代碼編輯了我的問題。它仍然沒有工作。我試着用CREATE_SUSPENDED標誌以及DEBUG_PROCESS標誌啓動進程。兩者都不起作用。 – jyotesh

0

你正在努力。系統已經準備好爲任何任意進程啓動調試器。您只需將Image File Execution Options設置爲launch the debugger automatically即可。

僅供參考,這裏有來自MSDN引用的說明:

要設置應用程序啓動調試器自動

  1. 啓動註冊表編輯器(regedit)。
  2. 在註冊表編輯器中,打開HKEY_LOCAL_MACHINE文件夾。
  3. 導航到HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image文件執行選項。
  4. 圖像文件執行選項文件夾中,找到要調試的應用程序的名稱,如myapp.exe。如果找不到要調試的應用程序:

    a。用鼠標右鍵單擊圖像文件執行選項文件夾,然後在快捷菜單上單擊新密鑰

    b。用鼠標右鍵單擊新的密鑰,然後在快捷菜單上,單擊重命名

    c。將密鑰名稱編輯爲應用程序的名稱; myapp.exe,在這個例子中。

  5. 右鍵單擊MyApp.exe的文件夾,在彈出的快捷菜單上,單擊新的字符串值

  6. 用鼠標右鍵單擊新的字符串值,然後在快捷菜單上單擊重命名
  7. 將名稱更改爲debugger
  8. 用鼠標右鍵單擊新的字符串值,然後在快捷菜單上單擊修改
    將出現編輯字符串對話框。
  9. 數值數據框中,輸入vsjitdebugger.exe
  10. Click OK
  11. 註冊表菜單中,單擊退出
  12. 包含vsjitdebugger.exe的目錄必須位於系統路徑中。要將其添加到系統路徑,請按照下列步驟操作:

    a。在經典視圖中打開控制面板,然後雙擊系統

    b。點擊高級系統設置

    c。在系統屬性中,單擊高級選項卡。 d)。在高級選項卡上,單擊環境變量

    e。在環境變量對話框中,在下的系統變量,選擇路徑,然後點擊編輯按鈕。

    f。在編輯系統變量對話框中,將目錄添加到變量值框中。使用分號將其與列表中的其他條目分開。 g。

    g。點擊確定關閉編輯系統變量對話框。 h。

    h。點擊確定關閉環境變量對話框。

    i。點擊確定關閉系統屬性對話框。

現在,使用任何方法來啓動您的應用程序。 Visual Studio將啓動並加載應用程序。

相關問題