天天看點

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

由于本人水準有限,文中有寫得不對的地方請指正,本文的方法有些投機取巧,實在是沒招的情況下可以酌情使用,如有侵權,請聯系删除。

前幾天接到一個需求,要在醫囑簽署時對檢驗項目進行分方操作,分方規則調用第三方的接口擷取(注:我們公司是做his系統的),我也是剛跳槽來到這家公司不久,有些代碼還不熟悉。要對檢驗項目進行分方操作,我大概知道是對處方表met_ord_recipedetail(這是我們公司的處方表)的處方号進行修改,雖然找到"簽署"按鈕對應代碼的入口,但裡面的業務邏輯牽扯較多,再加上命名不規範以及多個功能封裝在一個命名不嚴謹的方法裡面,想要找到對處方表met_ord_recipedetail操作的那一小段代碼邏輯,還是很費勁的。我最常用的方法是大膽猜測代碼可能出現的位置,發現不管用,反正那天早上嘗試了很多靠譜和不靠譜的方法,依舊沒找到。中午去吃飯的路上腦袋裡突然蹦出一個想法,既然我知道代碼會修改處方表met_ord_recipedetail(insert或者update,select的不行),那我豈不是可以手工鎖住該表,代碼調用的地方肯定會堵塞,然後通過反編譯調試工具dnSpy就能輕松找到要修改的代碼位置。後面通過該方法,還真見鬼的幾秒就給我找到了。

注意:千萬不能在真實環境的資料庫鎖表,要在開發庫上并且在人少使用系統的情況下操作

本文測試的環境:

1   oracle 19c資料庫

2   dnSpy v6.1.8反編譯調試工具

3   我們公司的用戶端系統(有點low,直接通過sql的方式連接配接資料庫的,不過管它的,能賺到錢就行)

廢話不多說,跟着我一起來體驗一把吧!

步驟1:打開我們公司的用戶端系統,開好醫囑等待通過點選"簽發"按鈕簽署醫囑,如圖:

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

步驟2:打開反編譯調試工具dnSpy,并附加用戶端程式,如下圖:

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

 步驟3:在簽發按鈕代碼入口打上斷電,如圖:

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

 步驟4:點選簽發按鈕,進入斷點如圖:

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

步驟5:在資料庫中手工鎖表(當然也得會解鎖)

我在pl-sql Developer工具中進行操作:

lock table met_ord_recipedetail in share mode nowait;

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

步驟6:點選反編譯工具的繼續按鈕繼續運作:

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

 由于我們的系統是在UI線程進行資料庫操作,是以很明顯就看到系統被堵塞了,這時我們就可以點選反編譯工具的"全部中斷"按鈕看代碼的堆棧了,如下圖:

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)
在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

 從上圖中我們就可以看到對應的堆棧了

步驟7:解鎖表,oracle的使用rollback即可

在屎山代碼中快速找到想要的代碼法-鎖表法(C#)

好了,本文到此結束