1. 程式人生 > >一路踩坑,被迫聊聊 C# 程式碼除錯技巧和遠端除錯

一路踩坑,被迫聊聊 C# 程式碼除錯技巧和遠端除錯

## 一:背景 ### 1. 講故事 每次專案預交付的時候,總會遇到各種奇葩的坑,我覺得有必要梳理一下以及如何快速解決的,讓後來人避避坑,這篇就聊聊自己的所聞所遇: * 我去,本地環境程式碼跑的哧溜,上了測試環境出問題 * 我去, 第三方提供的 dll 跑出 bug 了 ## 二:兩個大坑的解決方案 ### 1. 本地環境沒問題,上了測試出問題 相信很多朋友都有我這樣類似的遭遇,明明程式程式碼,配置檔案都一樣,挪了一個窩就出問題,你說氣人不,既然問題出了那怎麼快速解決呢? 對,就是用除錯,但程式部署在 centos 上,送一個 visualstudio 上去也不現實,在這種限制級條件下還想除錯怎麼辦呢?不錯,可以上遠端除錯,然後就很快查到了測試機器中的某一個環境變數搞錯了,事情的來龍去脈搞清楚了,接下來就看看怎麼實現 local 到 centos 的 遠端除錯。 #### 1) 測試程式碼 為了方便演示,我就在 Action 中讀取 strategy 環境變數。 ``` C# public class HomeController : Controller { public IActionResult Index() { ViewBag.strategy = Environment.GetEnvironmentVariable("strategy"); return View(); } } ``` #### 2) 安裝 SSH 要遠端除錯,需要在遠端機安裝 SSH,因為後面附加程序除錯 就要藉助 SSH 打通。 ``` bash yum install openssh-server unzip curl ``` 安裝完成後,就能看到 22 埠已啟動 ``` bash [root@localhost data]# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1126/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 3037/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1739/master tcp6 0 0 :::22 :::* LISTEN 1126/sshd tcp6 0 0 ::1:631 :::* LISTEN 3037/cupsd tcp6 0 0 ::1:25 :::* LISTEN 1739/master ``` #### 3) 程式的釋出配置 釋出配置上,第一個要確保是 debug 版本,第二個要確保是 可移植模式 (Portable), 如下圖: #### 4) 使用附加程序除錯 在選單欄依次選擇:Debug -> Attach To Process,然後填寫 ssh 需要的各種資訊,如下圖: 點選 Connect 後,就能看到遠端機器的 dotnet程式 程序號,選擇該程序進行附加,在 Select Code Type 中選擇 `Nanaged (.NET Core for Unix)`即可,如下圖: #### 5) 順利除錯 在 瀏覽器中鍵入: `http://192.168.142.130/Home/Index` ,可以看到我的 C# 程式碼被命中,也順利的拿到了遠端機器的 環境變數,問題也就迎刃而解。
### 2. 第三方 dll 出 bug 了 除錯程式除了使用 F9 進行除錯,相信也有不少朋友知道斷點是可以編輯的,比如說:設定表示式斷點,過濾器斷點,命中次數斷點,動作斷點,下如圖: ![](https://img2020.cnblogs.com/other/214741/202011/214741-20201104094519461-1550369286.png) 第一個問題就來了,這些花式斷點,你真的會用嗎?真的會經常用嗎? 讓我來回答的話,不到萬不得已我是不會用的,我更願意在程式碼中加入利於除錯的測試語句,原因有三點: * 更加靈活 這個顯而易見,在面板中設定條件相比用純語句設定要麻煩得多,點來點去,而且還要條件疊加,複雜的很,我是不喜歡。 * 功能強大 編輯面板上只有簡單的並且關係,而且各個條件還是同級別的,無法做到各個條件的或者關係以及層級或者遞迴的包含關係,所以。。。沒辦法。。。 * 更易於儲存 這個就有意思了,在斷點上右鍵是彈出編輯面板,點選左鍵是關閉斷點,問題就出在這裡,經常由於手賤,本想點右鍵結果點了左鍵