Re: [問題] 用 GCC 編譯出來的程式想給華生博士偵錯

看板Programming作者 (冒煙中...)時間11年前 (2013/09/03 14:10), 編輯推噓6(6025)
留言31則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《SeamusBerloz (軒摩斯)》之銘言: <引言刪除> : 以下我寫了簡單的 crash 程式,由華生博士偵測後log 記錄之檔案, : 節錄貼出來,並於後附上 crash 原始碼: : *----> 執行執行緒識別碼 0xeac 的狀態傾印<----* : eax=00000000 ebx=7ffd8000 ecx=00000000 edx=00000000 esi=00000000 edi=00000012 : eip=00401329 esp=0022ff40 ebp=0022ff68 iopl=0 nv up ei pl zr na po nc : cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 : *** ERROR: Module load completed but symbols could not be loaded for D:\Temp\DrWaston\crash.exe : 功能: crash : 00401310 fc cld : 00401311 fe00 inc byte ptr [eax] : 00401313 0000 add [eax],al : 00401315 7f51 jg crash+0x1368 (00401368) : 00401317 8b45fc mov eax,[ebp-0x4] : 0040131a 8b0d08404000 mov ecx,[crash+0x4008 (00404008)] : 00401320 01c1 add ecx,eax : 00401322 8b55f8 mov edx,[ebp-0x8] : 00401325 b0ff mov al,0xff : 00401327 20d0 and al,dl : 錯誤 ->00401329 8801 mov [ecx],al ds:0023:00000000=?? : int main(void) : { : int i, iCounter = 0; : for(i = 0; i < 255; i ++) : { : g_lpCharacterPointer[i] = (char)(iCounter & 0xff); 根據ASM code,你應該是這一行出問題 你的整個code裡面 g_lpCharacterPointer 是在 TestFunction()裡面才做 allocate,可是main()這邊卻在呼叫 TestFunction() 之前就先填字進去, 當然會crash :p 把allocate memory的動作移到main()裡面 for loop前面吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.45.186.69

09/03 23:09, , 1F
感謝您!不過這個程式只是個示範,
09/03 23:09, 1F

09/03 23:10, , 2F
是我用來觸發 Dr. Watson 用的,
09/03 23:10, 2F

09/03 23:10, , 3F
(煩請參看原貼文)
09/03 23:10, 3F

09/03 23:10, , 4F
目的在於給大家看看 gcc 所編譯的程
09/03 23:10, 4F

09/03 23:10, , 5F
被 Dr. Watson 紀錄的 log 檔案內容
09/03 23:10, 5F

09/03 23:10, , 6F
關於 Label 與函數等都被化為位址偏
09/03 23:10, 6F

09/03 23:11, , 7F
當程式巨大,想要判別是哪一段程式
09/03 23:11, 7F

09/03 23:11, , 8F
產生存取違規,相對困難很多。
09/03 23:11, 8F

09/03 23:11, , 9F
另外因為實際要捕捉的程式相當大,
09/03 23:11, 9F

09/03 23:11, , 10F
出現違規存取的點,也不是固定出現,
09/03 23:11, 10F

09/03 23:11, , 11F
需要慢慢等候運作被中止才能在提供
09/03 23:11, 11F

09/03 23:12, , 12F
上來給大家看看了,再次感謝您的協助
09/03 23:12, 12F

09/03 23:37, , 13F
dwarf格式windbg不認,mingw也不能生pdb
09/03 23:37, 13F

09/03 23:38, , 14F
如果你能查出pc值的話. 用-g編,可以用
09/03 23:38, 14F

09/03 23:38, , 15F
mingw的objdump -dl 查行號對應
09/03 23:38, 15F

09/04 00:06, , 16F
不好意思,不太了解你的意思...
09/04 00:06, 16F

09/04 00:07, , 17F
pc 值是指指令二元碼嗎?
09/04 00:07, 17F

09/04 00:09, , 18F
還是指 EIP 暫存器的值?
09/04 00:09, 18F

09/04 00:12, , 19F
的確!剛剛嘗試了一下,eip 的確可以
09/04 00:12, 19F

09/04 00:14, , 20F
對應到行號,並且正好等於log中的eip
09/04 00:14, 20F

09/04 00:14, , 21F
不知道是不是運氣好?程式載入偏移
09/04 00:14, 21F

09/04 00:15, , 22F
位址剛好相等?dll 之中也這樣嗎?
09/04 00:15, 22F

09/04 00:16, , 23F
我想說,若錯誤發生於 dll 中怎辦?
09/04 00:16, 23F

09/04 00:18, , 24F
因為dll也是我自己寫的說 -__-...
09/04 00:18, 24F

09/04 22:35, , 25F
xp的話,執行檔應該不會做ASLR,所以會固定
09/04 22:35, 25F

09/04 22:35, , 26F
dll有被rebase的話,自已算一下offset orz
09/04 22:35, 26F

09/04 23:15, , 27F
瞭解!沒錯!正猜大概要自己算偏移呢
09/04 23:15, 27F

09/04 23:17, , 28F
多一份方案,多一分實力,多多益善
09/04 23:17, 28F

09/04 23:18, , 29F
就是了!感謝您唷!
09/04 23:18, 29F

10/03 22:14, , 30F
位址化偏移你首先要抓的重點是base addr
10/03 22:14, 30F

10/03 22:15, , 31F
我猜你在log看到的偏移是 00001327 吧?
10/03 22:15, 31F
文章代碼(AID): #1I9UtQSU (Programming)
文章代碼(AID): #1I9UtQSU (Programming)