代碼丟了?用搜索找出真相
緣起
前幾天,修復(fù) bug 后,本地測(cè)試通過(guò),提交代碼到 tfs,關(guān)閉 bug。但是客戶拿到程序后,效果依然不對(duì)。來(lái)來(lái)回回檢查了好幾遍,邏輯是正確的,本地驗(yàn)證通過(guò)了,代碼也確實(shí)上傳到 tfs 了,但是程序到客戶手里,效果確實(shí)不對(duì)。如果是你,該如何調(diào)(shuai)查(guo)呢?
說(shuō)明:本文只是分享一種排查問(wèn)題的思路。
背景介紹
用一句話描述遇到的問(wèn)題就是:在修改 bug 時(shí),加了一句關(guān)鍵的 result.push_back(L"地下室外墻"),但是客戶那里卻沒(méi)有看到新加的字符串。
排查思路
在我看來(lái),這個(gè)問(wèn)題有兩種可能:
客戶拿到的程序并沒(méi)有包含最新的修復(fù)。 修復(fù)的邏輯有問(wèn)題,只不過(guò)在本機(jī)測(cè)試的時(shí)候沒(méi)有暴露出來(lái)。
因?yàn)檎麄€(gè)修復(fù)邏輯很簡(jiǎn)單,不太可能出錯(cuò),難不成還真有可能是第一種情況?該如何排查呢?
代碼里的字符串一定會(huì)以某種格式保存在最終生成的程序文件里。如果客戶拿到的程序里沒(méi)有這個(gè)字符串,說(shuō)明客戶拿到的程序并沒(méi)有包含最新的修復(fù)。
該怎么搜?
因?yàn)殛P(guān)鍵代碼在 dll 文件中,不能直接使用 windbg 打開(kāi)。否則就可以直接在 windbg 中使用 s -u 0x0 L?0xffffffffffffffff "地下室外墻" 搜索。沒(méi)關(guān)系,還有十六進(jìn)制編輯神器—— Hex Editor Neo。按 ctrl + f 調(diào)出搜索框,選擇 UNICODE String 并輸入要搜索的內(nèi)容, 即可搜索。

說(shuō)明:
上圖之所以能搜到,是因?yàn)槲倚陆艘粋€(gè)測(cè)試程序,里面包含了相關(guān)的字符串。在客戶機(jī)器上有問(wèn)題的 dll中并沒(méi)有搜索到的。Hex Editor Neo非常好用,但不是免費(fèi)軟件(有免費(fèi)版本)。歡迎推薦更好用的十六進(jìn)制編輯工具。
More
因?yàn)槲抑酪阉鞯淖址?UNICODE 編碼的,所以可以按 UNICODE String 進(jìn)行搜索。如果在不知道編碼的情況下該怎么搜索呢?
可以產(chǎn)生一個(gè)既包含目標(biāo)字符串又包含標(biāo)記字符串的測(cè)試字符串,通過(guò)搜索標(biāo)記字符串來(lái)找到目標(biāo)字符串在程序中的字節(jié)碼。可以編寫(xiě)如下測(cè)試代碼:
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << L"test地下室外墻test1test2test3!" << std::endl;
return 0;
}
在生成的程序中,分別嘗試以各種編碼類型搜索關(guān)鍵字 test1test2test3 ,這樣就可以找到目標(biāo)字符串在最終程序中的字節(jié)碼了。

有了這個(gè)字節(jié)碼,就可以大概猜出來(lái)是什么編碼了,或者既然已經(jīng)拿到對(duì)應(yīng)的字節(jié)碼,可以直接根據(jù)字節(jié)碼搜索。
總結(jié)
善用搜索工具,也許會(huì)有意想不到的效果。
