Programming 板


LINE

※ [本文转录自 LinuxDev 看板 #1I96EHJt ] 请教前辈: 我在 linux 下安装了 MinGW,可编译出 Win32 可执行档。 今有只程式在 Win32 下运作却无预警被关闭,想用 Dr. Watson 来进行捕捉, 得到 dump 档与 log 档,而 log 档内写着一行: *** ERROR: Module load completed but symbols could not be loaded for ... 我相信我的 symbols 都有安装好路径,但实在不解为何还是有这个讯息出现... 而反组译发生错误的程式码,都只有位址偏移,无从得知函数呼叫的情形, 由於光只拿着这一堆组合语言,实在无从 debug 起, 这个窘境有什麽方法解决或其他工具能更深入分析吗? (不知道这个问题在这里贴文是否适合,如有不当,敬请见谅!) 以下我写了简单的 crash 程式,测试一下由华生博士侦测後log 记录之档案, 节录贴出来,让大家看看我捕捉 gcc 程式的效果,并於後附上 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=?? 0040132b 8b45fc mov eax,[ebp-0x4] 0040132e 030508404000 add eax,[crash+0x4008 (00404008)] 00401334 0fbe00 movsx eax,byte ptr [eax] 00401337 89442408 mov [esp+0x8],eax 0040133b 8b45fc mov eax,[ebp-0x4] 0040133e 89442404 mov [esp+0x4],eax 00401342 c7042410304000 mov dword ptr [esp],0x403010 00401349 e85a050000 call crash+0x18a8 (004018a8) 0040134e 8b45fc mov eax,[ebp-0x4] 00401351 890424 mov [esp],eax 编译指令: ~$ i386-mingw-gcc -g -o crash.exe crash.c 原始码: << crash.c >> #include <stdio.h> #include <stdlib.h> char *g_lpCharacterPointer = NULL; void TestFunction(int iSize) { int i; if((g_lpCharacterPointer = (char *)malloc(sizeof(char) * iSize)) == NULL) { printf("Out of memory!\n"); return; } for(i = 0; i < iSize; i ++) { g_lpCharacterPointer[i] = (char)(i & 0xff); } free(g_lpCharacterPointer); } int main(void) { int i, iCounter = 0; for(i = 0; i < 255; i ++) { g_lpCharacterPointer[i] = (char)(iCounter & 0xff); printf("g_lpCharacterPointer[%d] == %d", i, g_lpCharacterPointer[i]); TestFunction(i); iCounter += i; } return 0; } --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 183.4.116.230



※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: SeamusBerloz (183.4.116.230), 时间: 09/03/2013 10:37:08
1F:推 LPH66:在 MinGW 下编译时加上 -g 看看? 210.69.49.38 09/03 11:32
2F:→ LPH66:(这是 GCC 加入除错讯息的选项) 210.69.49.38 09/03 11:33
3F:→ SeamusBerloz:谢谢 L 大!但我加过了,没用耶, 183.4.116.230 09/03 12:53
4F:→ SeamusBerloz:情况没有改变... 183.4.116.230 09/03 12:53
5F:→ suhorng:可能要研究一下用的档案格式是哪种 140.112.16.131 09/03 13:24
6F:→ suhorng:-g好像是预设dwarf格式 (我不熟...) 140.112.16.131 09/03 13:25
7F:推 Slither:try windbg 163.1.130.189 09/03 17:39
8F:→ SeamusBerloz:不很熟 windbg,但一样找不到 symbol 183.4.116.230 09/03 21:55
9F:→ SeamusBerloz:还是说,symbols 要怎样安装才正确? 183.4.116.230 09/03 22:01
10F:推 purpose:到底是为什麽,不直接用gdb执行到当掉就好 124.8.133.254 09/04 17:59
说来话长,主要是因为 target 环境空间等不方便... 实验室中实验板上不曾发生退出,然而这次的 bug 十分诡异, 仅在工厂组装线与机台设备共同运行时才出现,久久才累积一两次, 并且不是可控制的重复或随时出现,也更不是固定点出现退出情形, 机台设备十分昂贵,只能工厂摆放一台实际测试, 当然也都是靠工厂小朋友回报,才知道此当机退出的情形。 该 win32 平台实际是 XPe SP2,靠 SSD 当作储存媒体。 需要的环境与程式经由 ghost 安装到 SSD 後再安插到机台上。 主机板是订制的工规板,没有焊接 USB,连 PS/2 都没有... 料想既然如此,就用捕捉的方式,进行错误讯息的最後保留, 於是 XPe 建构时要求多编入了 华生博士,尝试最後一点希望, 然後拆回 SSD,拿到实验室分析。 但若尝试 gdb 当作 Win32 预设的 debugger, 自动带起进行错误 dump,的确也是很好的点子, 我相信应该就是只差参数不知道怎样下达, HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows NT\CurrentVersion\AeDebug Debugger = %SystemRoot%//GNU//gdb -pid %ld ...? 只是至今还没成功罢了... 故事写到这里,若再没有简易一点的办法, 不排除直接采如 p 大的建议,拿出 EE 的 guts 暂换实验板,上键盘,睡工厂...(T_T),用 gdb 等他当掉... ※ 编辑: SeamusBerloz 来自: 183.4.123.29 (09/04 21:32)
11F:推 yvb:这篇 MinGW FAQ 的 11. Debugging 不知如何? 220.136.71.103 09/04 21:33
12F:→ yvb:http://ppt.cc/Hi6x 220.136.71.103 09/04 21:34
Dr.MinGW?!我还真没见过这家伙呢,感恩唷!赶紧研究一下先! ※ 编辑: SeamusBerloz 来自: 183.4.123.29 (09/04 21:47) 太棒了!直接出错误发生的行号给我 (有点废话~呵呵!), 不过,这的确是目前最适合我的工具了!直接替代华生博士! 这麽好用的东西竟然我今天才知道,感谢!感谢!非常感谢~ <(_ _)> ※ 编辑: SeamusBerloz 来自: 183.4.123.29 (09/04 22:05) 在此给大家贴一下原述中的测试范例程式 crash.exe 的 dump 效果: crash.exe caused an Access Violation at location 00401397 in module crash.exe Writing to location 00000000. Registers: eax=00000000 ebx=7ffdf000 ecx=00000000 edx=00000000 esi=00000000 edi=00000012 eip=00401397 esp=0022ff50 ebp=0022ff78 iopl=0 nv up ei pl zr na po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 Call stack: 00401397 crash.exe:00401397 main crash.c:32 int main( ) ... for(i = 0; i < 255; i ++) { > g_lpCharacterPointer[i] = (char)(iCounter & 0xff); printf("g_lpCharacterPointer[%d] == %d", i, g_lpCharacterPointer[i]); ... 004010B6 crash.exe:004010B6 00401148 crash.exe:00401148 7C817077 kernel32.dll:7C817077 RegisterWaitForInputIdle 只可惜我找到的这一版本,好像不能直接自动存档, 不过效果相信已经非常好了。持续研究中... 以上版本是这里取得的: http://code.google.com/p/jrfonseca/wiki/DrMingw ※ 编辑: SeamusBerloz 来自: 183.4.123.29 (09/04 22:28) Dr. MinGW 可说是 MinGW 爱用者的救星, 他甚至连 target 平台都不用安装,也可以 dump 程式发生的错误, 只需要将随附的 exchndl.dll 档案,引用至程式中: 节录一下我新的测试程式 crash_new.c: << crash_new.c >> #include <windows.h> ... int main(void) { ... LoadLibrary("./exchndl.dll"); ... } ... // 编译指令: ~$ i386-mingw-gcc -g -fno-omit-frame-pointer -o crash.exe crash.c 然後将 exchndl.dll 与 mgwhelp.dll 放置在引入路径中, 只要程式发生 crash,就会自动产生 crash.RPT 档案, 这相当於华生博士的 log 档案。 所以 target 有没有设置 debugger 看来也无所谓了! 真是太棒了,再次感谢各位协助! ※ 编辑: SeamusBerloz 来自: 183.4.123.29 (09/04 23:05)
13F:推 purpose:看了一下介绍 Dr. Mingw 能解析 gcc 跟 vc 124.8.133.254 09/04 23:22
14F:→ purpose:两者的符号,确实很好的工具 124.8.133.254 09/04 23:22
15F:推 MOONRAKER:Great 118.163.12.174 09/05 16:36







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP