[環境準備]
Remote Debug先前準備
兩台電腦、網路線、Hub或IP分享器。
使用環境
Host 機器:安裝Win7 x86 + VC2010
Target 機器:Winpe 3.0 x86
Host 機器IP:192.168.0.12
Target 機器IP:192.168.0.14
Host 機器與Target 機器的操作環境設定。
[程式碼]
void GetErrorMessage(DWORD dwErrorMessageCode) { CString strMsg; LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorMessageCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 預設語言 (LPTSTR) &lpMsgBuf, 0, NULL); strMsg.Format(_T("Error Message : %sError Code : 0x%X\n"), lpMsgBuf, dwErrorMessageCode); printf(strMsg); LocalFree(lpMsgBuf); // 記得free掉空間 } BOOL Run() { HDEVINFO hdev; DWORD idx; BOOL bFound = FALSE; hdev = SetupDiGetClassDevs( NULL, NULL, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES); if (hdev == INVALID_HANDLE_VALUE ) { printf("ERROR : Unable to enumerate device\n"); return FALSE; } SP_DEVINFO_DATA devinfo; devinfo.cbSize = sizeof(devinfo); for (idx = 0 ; SetupDiEnumDeviceInfo(hdev,idx,&devinfo); idx++) { BYTE Buffer[200]; DWORD BufferSize = 0; DWORD DataType; int q=0; DWORD Status, Problem; CONFIGRET cr = CR_SUCCESS; printf("NO. %d\n", idx); cr = CM_Get_DevNode_Status(&Status, &Problem, devinfo.DevInst ,0); if ( CR_SUCCESS == cr) { printf("OK - CM_Get_DevNode_Status()[%d]\n", cr); printf("OK - CM_Get_DevNode_Status() sts [%x]\n", Status); printf("OK - CM_Get_DevNode_Status() pro [%x]\n", Problem); } else { printf("ERROR - CM_Get_DevNode_Status()[%d]\n", cr); printf("ERROR - CM_Get_DevNode_Status()[%d]\n", GetLastError()); } if (SetupDiGetDeviceRegistryProperty(hdev, &devinfo, SPDRP_HARDWAREID, &DataType, Buffer, sizeof(Buffer), &BufferSize)){ printf("Hardware ID : %s\n", (const char *)Buffer); } if (SetupDiGetDeviceRegistryProperty(hdev, &devinfo, SPDRP_DEVICEDESC, &DataType, Buffer, sizeof(Buffer), &BufferSize)){ printf("Hardware name : %s\n", (const char *)Buffer); } printf("\n"); } SetupDiDestroyDeviceInfoList(hdev); return TRUE; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; nRetCode = Run(); return nRetCode; }
[Host 機器]
Step 1. 拷貝VC2010 Remote debug所需檔案。
路徑來源:C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger下的Folder,我們要Debug的程式是Build成x86該版本,所以直接使用 x86 Folder裡的檔案。
Step 2. 設定Project在VC2010中執行Remote debug所需的參數。
[General分頁]
Output Directory:./Debug【執行檔位置,Host電腦,或是以”$(SolutionDir)$(Configuration)\”輸入】
[Debugging分頁]
Debugger to laubch:Remote Windows Debugger
Remote Command:Z:\RemoteDebug.exe【執行檔位置,Remote電腦(Remote電腦step2.路徑) 絕對路徑】
Remote Command Arguments:log.txt
Working directory:Z:\【執行檔執行目錄,Remote電腦(Remote電腦step2.路徑)】
Remote Server Name:192.168.0.14【Remote電腦IP or Remote電腦名稱】
Connection:Remote with no authentication(Native Only)【以匿名身份模式進行遠端測試】
Step 3. 開始Debug 程式。
PS:執行專案進行Remote debug,第一次執行含有MFC class的VC2010專案時,會在[Target 機器]畫面出現警告提示缺少部分DLL,像MFC100D.DLL、MSVCP100D.DLL,皆可到C:\Windows\System32資料夾中找到,並請將以上DLL拷貝至執行檔的目錄下C:\REMOTEDEBUG\RemoteDebugTest\Debug\即可,其他若不含MFC class則無需添加。
[Target 機器]
Step 1. 安裝網路環境與複製檔案。
- 複製Debug所需的檔案至Target 機器。
- 由於Winpe3.0中並沒有支援全部廠商的網卡,所以需要安裝該機器可在Win7上所用網卡Driver。
- 關閉防火牆。
- 以Command,在Winpe3.0上建立網路磁碟機連線。
- Command:net use [磁碟機代碼] [網路資料夾來源] /user:[使用者帳號] [使用者密碼]。
if "%1"== "" echo Please entry filepath. && goto end ::設定環境變數 set filepath=%1 ::切換路徑 X: cd \ ::建立Remote Debug資料夾並切換 mkdir RemoteDebug cd RemoteDebug ::前面列表的準備檔案,複製到X:\RemoteDebug下 xcopy %filepath%:\VC2010\*.* . /e /i /k /y ::安裝LAN Driver drvload LAN\rt86win7.inf ::關閉Winpe的防火牆,如此網路才能對外連結 wpeutil DisableFirewall ::Windows 7以後的版本都有此timeout.exe,可至C:\Windows\System32\下找到 ::延遲7秒是為了讓Lan driver在安裝後可以正常執行,低於7秒將會導致後面無法建立網路磁碟機 timeout.exe 7 ::建立網路磁碟機Z: net use z: \\AMIN-PC\RemoteDebug /user:Amin5168 12345678 msvsmon.exe /timeout:9999999 /nostatus /noauth /anyuser /nosecuritywarn :End
Step 2. 執行Msvsmon.exe連結Host電腦,第一次執行時會出現”無法確定防火牆是否為關閉”警告視窗,所以需在此步驟前先關閉防火牆。
Command:msvsmon.exe /timeout:9999999 /nostatus /noauth /anyuser /nosecuritywarn
Step 3. 當[Host 機器]開始Debug時,就會見到畫面開始運作。
沒有留言:
張貼留言