您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)如何實(shí)現(xiàn)遠(yuǎn)程調(diào)試c# 代碼,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
一:背景
1. 講故事
每次項(xiàng)目預(yù)交付的時(shí)候,總會(huì)遇到各種奇葩的坑,我覺得有必要梳理一下以及如何快速解決的,讓后來人避避坑,這篇就聊聊自己的所聞所遇:
我去,本地環(huán)境代碼跑的哧溜,上了測試環(huán)境出問題
我去, 第三方提供的 dll 跑出 bug 了
二:兩個(gè)大坑的解決方案
1. 本地環(huán)境沒問題,上了測試出問題
相信很多朋友都有我這樣類似的遭遇,明明程序代碼,配置文件都一樣,挪了一個(gè)窩就出問題,你說氣人不,既然問題出了那怎么快速解決呢? 對,就是用調(diào)試,但程序部署在 centos 上,送一個(gè) visualstudio 上去也不現(xiàn)實(shí),在這種限制級條件下還想調(diào)試怎么辦呢?不錯(cuò),可以上遠(yuǎn)程調(diào)試,然后就很快查到了測試機(jī)器中的某一個(gè)環(huán)境變量搞錯(cuò)了,事情的來龍去脈搞清楚了,接下來就看看怎么實(shí)現(xiàn) local 到 centos 的 遠(yuǎn)程調(diào)試。
1) 測試代碼
為了方便演示,我就在 Action 中讀取 strategy 環(huán)境變量。
public class HomeController : Controller { public IActionResult Index() { ViewBag.strategy = Environment.GetEnvironmentVariable("strategy"); return View(); } }
2) 安裝 SSH
要遠(yuǎn)程調(diào)試,需要在遠(yuǎn)端機(jī)安裝 SSH,因?yàn)楹竺娓郊舆M(jìn)程調(diào)試 就要借助 SSH 打通。
yum install openssh-server unzip curl
安裝完成后,就能看到 22 端口已啟動(dòng)
[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) 程序的發(fā)布配置
發(fā)布配置上,第一個(gè)要確保是 debug 版本,第二個(gè)要確保是 可移植模式 (Portable), 如下圖:
4) 使用附加進(jìn)程調(diào)試
在菜單欄依次選擇:Debug -> Attach To Process,然后填寫 ssh 需要的各種信息,如下圖:
點(diǎn)擊 Connect 后,就能看到遠(yuǎn)端機(jī)器的 dotnet程序 進(jìn)程號,選擇該進(jìn)程進(jìn)行附加,在 Select Code Type 中選擇 Nanaged (.NET Core for Unix)即可,如下圖:
5) 順利調(diào)試
在 瀏覽器中鍵入: http://192.168.142.130/Home/Index ,可以看到我的 C# 代碼被命中,也順利的拿到了遠(yuǎn)端機(jī)器的 環(huán)境變量,問題也就迎刃而解。
2. 第三方 dll 出 bug 了
調(diào)試程序除了使用 F9 進(jìn)行調(diào)試,相信也有不少朋友知道斷點(diǎn)是可以編輯的,比如說:設(shè)置表達(dá)式斷點(diǎn),過濾器斷點(diǎn),命中次數(shù)斷點(diǎn),動(dòng)作斷點(diǎn),下如圖:
第一個(gè)問題就來了,這些花式斷點(diǎn),你真的會(huì)用嗎?真的會(huì)經(jīng)常用嗎?
讓我來回答的話,不到萬不得已我是不會(huì)用的,我更愿意在代碼中加入利于調(diào)試的測試語句,原因有三點(diǎn):
這個(gè)顯而易見,在面板中設(shè)置條件相比用純語句設(shè)置要麻煩得多,點(diǎn)來點(diǎn)去,而且還要條件疊加,復(fù)雜的很,我是不喜歡。
編輯面板上只有簡單的并且關(guān)系,而且各個(gè)條件還是同級別的,無法做到各個(gè)條件的或者關(guān)系以及層級或者遞歸的包含關(guān)系,所以。。。沒辦法。。。
這個(gè)就有意思了,在斷點(diǎn)上右鍵是彈出編輯面板,點(diǎn)擊左鍵是關(guān)閉斷點(diǎn),問題就出在這里,經(jīng)常由于手賤,本想點(diǎn)右鍵結(jié)果點(diǎn)了左鍵 😨😨😨。。。。 好不容易設(shè)置好的條件沒了。。。真的沒了😭😭😭,從此以后,路轉(zhuǎn)黑。如下圖:
那這么說斷點(diǎn)編輯真的沒用嗎? 我覺得只有在不能修改語句的調(diào)試場景下能夠大顯身手,比如我遇到的調(diào)試廠家封裝的dll,哈哈,既然說到了斷點(diǎn),我就用 dnspy 演示幾個(gè)斷點(diǎn)給大家復(fù)習(xí)一下吧!
1) 測試代碼
為方便演示,用 for 循環(huán)案例是最好的。
public static void Main(string[] args) { var sum = 0; for (int i = 0; i < 10000; i++) { sum += i; } Console.WriteLine($"sum={sum}"); }
2) 我希望在 sum = 1035 的時(shí)候命中斷點(diǎn)
這個(gè)用條件表達(dá)式斷點(diǎn)就可以了,非常簡單,如下所示:
3) 找到所有能夠被 1800 整除的數(shù),并且記錄下當(dāng)時(shí)的 i 和 sum 值
這里就可以用到 Action 斷點(diǎn)的日志記錄,在 for 循環(huán)迭代中,不需要中斷斷點(diǎn),只需記錄某一個(gè)特定狀態(tài)下當(dāng)前的 i 和 sum 的值,對調(diào)試代碼非常有幫助,如下圖:
看完上述內(nèi)容,你們對如何實(shí)現(xiàn)遠(yuǎn)程調(diào)試c# 代碼有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。