﻿# 如何透過 Visual Studio 對任何不在專案內的程式進行除錯

[前天](/post/2008/08/24/How-to-debug-any-website-javascript-error-using-Visual-Studio)我有提到如何在 Visual Studio 中利用 Attach to Process 功能可以對任意執行中的程式進行除錯。但有時後程式一啟動就立即發生錯誤，導致程式難以除錯，遇到這種情況其實在 Visual Studio 也是有解的！

首先，先透過 \[File\] / \[Open\] / \[Project/Solution\] 開啟執行檔：

![Visual Studio - \[File\] / \[Open\] / \[Project/Solution\] ](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f14c08fd62005feb104e-image_3.png)

然後直接選取要除錯的執行檔，當成一個專案來開啟。但有一件事必須特別注意，如果該執行檔沒有附帶符號檔(Symbol File)的話，幾乎無法除錯，因為 Symbol File 中包含了許多原本程式的資訊，包括原始檔路徑、程式行數與許多有用的除錯資訊。以下圖為例，ConsoleApplication5.exe 的 Symbol File 就是 ConsoleApplication5.pdb。

![Visual Studio - Open Project](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2ed9ffa9d684a9af8872-image_6.png)

開啟後的 Solution Explorer 就會出現該執行檔，此時只要按下 F5 就可以啟動該程式並進入除錯模式了。

![Visual Studio - Solution Explorer](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a6bcdd4c5ed4e3ebfdf6-image_9.png)

當出現例外狀況(Exception)時，Visual Studio 預設會先到你原本編譯時原始檔的目錄下抓取原始檔，用以標示發生錯誤的地方。但如果該程式不是你寫的，或除錯時原始檔不在原本路徑的話，Visual Studio 就會跟你要此程式的原始檔，如果有的話你可以指定給他，若沒有就直接按取消也行。

![Visual Studio - Find Source: Program.cs](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0628f1e832b00d31775a-image_12.png)

在這裡我們假設沒有原始碼，按下取消後 Visual Studio 會問你要不要使用 Disassembly 進行除錯，當你使用 Disassembly 進行除錯就會看到最原始的 .NET 原始碼 ( IL )與例外狀況的摘要資訊，當然你也可以按下 View Detail 用以查看完整的 Stack Trace 資訊，有了這些線索通常都可以很順利的找到問題所在。

![Visual Studio - Debugging - Disassembly](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/192bf20e30a732046b1f-image_19.png)
