dll工程如何生成dump文件,方便崩溃时查找bug

rensq8808 2016-05-11 08:10:18
大虾们好:
我用vs2010工具编写Win32标准 DLL,又另外实现了一个windows服务:加载这个dll,服务放在windows server08上面跑。现在服务偶尔会崩溃,看windows程序事件:提示是0XC0000005异常,这像是内存越界了。

我的问题是:怎样在dll工程里实现生成dump文件,这样在程序崩溃后可以记录调用堆栈.以便定位问题。 求教各路大神,指点一二
...全文
735 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rensq8808 2016-05-18
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
加足够详细的日志和会在日志中使用findstr或grep大海捞针是7×24服务程序开发的基本功。
感谢大神关注!我现在 在通过生成map文件和cod文件进行定位,遇到新的问题想请教您! 1、 异常代码: 0xc0000005 错误偏移量: 0x000024e1 ************************************************************************************************************************* 2、map文件里定位到是DoAskVideo这个函数, 0001:00001250 ?DoAskVideo@CChannels@@AAEXPADH@Z 10002250 f Channels.obj 0001:00001530 ?DoAskRecord@CChannels@@AAEXPADH@Z 10002530 f Channels.obj ************************************************************************************************************************* 3、打开Channels.cod这个文件,截取DoAskVideo成员函数的部分汇编代码如下: ; 936 : { ; 937 : g_wkThrdForMediaServ[iIdx]->WorkForVideo(0); 0026a 8d 45 a4 lea eax, DWORD PTR $T115644[ebp] 0026d 50 push eax 0026e c7 45 a4 00 00 00 00 mov DWORD PTR $T115644[ebp], 0 00275 e8 00 00 00 00 call ?WorkForVideo@CWorkThrdForMediaServ@@QAEXABH@Z ; CWorkThrdForMediaServ::WorkForVideo ; 938 : g_wkThrdForMediaServ[iIdx]->WorkForListen(iListen == 0 ? TRUE: FALSE); 0027a 8b 14 bd 00 00 00 00 mov edx, DWORD PTR ?g_wkThrdForMediaServ@@3PAPAVCWorkThrdForMediaServ@@A[edi*4] 00281 33 c9 xor ecx, ecx 00283 39 4d 94 cmp DWORD PTR _iListen$98655[ebp], ecx 00286 0f 94 c1 sete cl ; 939 : g_wkThrdForMediaServ[iIdx]->WorkForTalk(iTalk == 0 ? TRUE : FALSE); 00289 33 c0 xor eax, eax 0028b 39 45 98 cmp DWORD PTR _iTalk$98656[ebp], eax 0028e 0f 94 c0 sete al 00291 89 4a 48 mov DWORD PTR [edx+72], ecx 00294 8b 34 bd 00 00 00 00 mov esi, DWORD PTR ?g_wkThrdForMediaServ@@3PAPAVCWorkThrdForMediaServ@@A[edi*4] 0029b 50 push eax 0029c e8 00 00 00 00 call ?WorkForTalk@CWorkThrdForMediaServ@@QAEXH@Z ; CWorkThrdForMediaServ::WorkForTalk ; 940 : } 根据0x100024e1 - 0x10002250 = 0x291 得知,崩溃是在00291 89 4a 48 mov DWORD PTR [edx+72], ecx 这个地方,对应的源码是 第939行 “ g_wkThrdForMediaServ[iIdx]->WorkForTalk(iTalk == 0 ? TRUE : FALSE); ” 可我的问题是,崩溃行又是对另一个类对象指针的成员函数调用, 看不出来崩溃原因, 我是该追踪到WorkForTalk这个函数里面去吗? 现在我虽然定位到源码第939行崩溃,可看这个地方看不出毛病呢? 大神帮我看看吧
赵4老师 2016-05-13
  • 打赏
  • 举报
回复
加足够详细的日志和会在日志中使用findstr或grep大海捞针是7×24服务程序开发的基本功。
rensq8808 2016-05-13
  • 打赏
  • 举报
回复
引用 9 楼 jzycode 的回复:
干软件,居然不知道怎么调式,加日志,那得加多少日志,擦,
安装在客户机器上的服务软件出现异常AppCrash
引用 8 楼 VisualEleven 的回复:
利用SetUnhandledExceptionFilter、MiniDumpWriteDump()试试看看
非常感谢
rensq8808 2016-05-12
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
这个只要你的service crash的时候有dump,你就可以用dll对应的pdb结合dump,用windbg来分析
错误应用程序名称: DeviceAccessGatewayServices.exe,版本: 0.0.0.0,时间戳: 0x5732ca8f 错误模块名称: DevAccessGatewayService.dll,版本: 0.0.0.0,时间戳: 0x5732e16d 异常代码: 0xc0000005 错误偏移量: 0x00002291 错误进程 ID: 0x60c 错误应用程序启动时间: 0x01d1ab5f8dadd4e9 错误应用程序路径: 。。。。。\DeviceAccessGatewayServices.exe 错误模块路径: 。。。。。\DevAccessGatewayService.dll 报告 ID: 38426c6e-17d3-11e6-91a0-204747874bac 是这个吧?错误偏移量: 0x00002291,这个我应该怎样用windbg结合pdb分析偏移量地址? 感谢大神
_船长_ 2016-05-12
  • 打赏
  • 举报
回复
干软件,居然不知道怎么调式,加日志,那得加多少日志,擦,
rensq8808 2016-05-12
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
你也可以在你的dll/exe中关键位置加些log信息,然后分析log文件。
老司机都教我用加日志的方式查, 但我总觉得有点漫无目的 大海捞针的感觉
Eleven 2016-05-12
  • 打赏
  • 举报
回复
利用SetUnhandledExceptionFilter、MiniDumpWriteDump()试试看看
rensq8808 2016-05-12
  • 打赏
  • 举报
回复
引用 4 楼 oyljerry 的回复:
[quote=引用 3 楼 rensq8808 的回复:] [quote=引用 1 楼 oyljerry 的回复:] 这个只要你的service crash的时候有dump,你就可以用dll对应的pdb结合dump,用windbg来分析
错误应用程序名称: DeviceAccessGatewayServices.exe,版本: 0.0.0.0,时间戳: 0x5732ca8f 错误模块名称: DevAccessGatewayService.dll,版本: 0.0.0.0,时间戳: 0x5732e16d 异常代码: 0xc0000005 错误偏移量: 0x00002291 错误进程 ID: 0x60c 错误应用程序启动时间: 0x01d1ab5f8dadd4e9 错误应用程序路径: 。。。。。\DeviceAccessGatewayServices.exe 错误模块路径: 。。。。。\DevAccessGatewayService.dll 报告 ID: 38426c6e-17d3-11e6-91a0-204747874bac 是这个吧?错误偏移量: 0x00002291,这个我应该怎样用windbg结合pdb分析偏移量地址? 感谢大神[/quote] 你把dll编译的时候生成的pdb文件加到windbg的symbol搜索路径中,然后重新加载dump[/quote] 不知道windows服务崩溃时生成的dump文件在哪,我就只找到Report.wer文件,wer后缀的
Eleven 2016-05-12
  • 打赏
  • 举报
回复
你也可以在你的dll/exe中关键位置加些log信息,然后分析log文件。
oyljerry 2016-05-12
  • 打赏
  • 举报
回复
引用 3 楼 rensq8808 的回复:
[quote=引用 1 楼 oyljerry 的回复:] 这个只要你的service crash的时候有dump,你就可以用dll对应的pdb结合dump,用windbg来分析
错误应用程序名称: DeviceAccessGatewayServices.exe,版本: 0.0.0.0,时间戳: 0x5732ca8f 错误模块名称: DevAccessGatewayService.dll,版本: 0.0.0.0,时间戳: 0x5732e16d 异常代码: 0xc0000005 错误偏移量: 0x00002291 错误进程 ID: 0x60c 错误应用程序启动时间: 0x01d1ab5f8dadd4e9 错误应用程序路径: 。。。。。\DeviceAccessGatewayServices.exe 错误模块路径: 。。。。。\DevAccessGatewayService.dll 报告 ID: 38426c6e-17d3-11e6-91a0-204747874bac 是这个吧?错误偏移量: 0x00002291,这个我应该怎样用windbg结合pdb分析偏移量地址? 感谢大神[/quote] 你把dll编译的时候生成的pdb文件加到windbg的symbol搜索路径中,然后重新加载dump
_船长_ 2016-05-11
  • 打赏
  • 举报
回复
参看SetUnhandledExceptionFilter函数,保存崩溃时的调用堆栈信息,用windbg + pdb + dump分析错误
oyljerry 2016-05-11
  • 打赏
  • 举报
回复
这个只要你的service crash的时候有dump,你就可以用dll对应的pdb结合dump,用windbg来分析
OllyDBG v1.10 plugin - StrongOD v0.2.6 by 海风月影[CUG] ==================================================================== [2009.09.01 v0.2.6.413] 1,添加加载微软符号库的选项 2,Cmdbar增加命令MSG,显示消息号 [2009.08.26 v0.2.6.410] 1,集成Command Bar功能(快捷键改成ALT+F1),可以抛弃cmdbar插件了 2,Cmdbar和TBAR插件兼容 [2009.08.24 v0.2.6.405] 1,全面支持win7(7600以下版本不支持) 2,增强解析PE的稳定性 3,修复tmd壳某些候attach上去无法下断点的漏洞 [2009.06.16 v0.2.5.388] 1,增加ring0稳定性 2,尝试杀掉NP线程 [2009.06.13 v0.2.5.384] 1,修复驱动几个bug,去掉字符串 2,稳定性增加,不再需要key [2009.04.24 v0.2.4.364] 1,驱动有很大改动,加了一些功能,与以前的StrongOD不兼容,更新后需要重启机器 2,启动检查ollydbg中的可疑线程 3,继续修改attach功能 4,修复加壳后无法使用远程注入的功能 [2009.04.03 v0.2.4.350] 1,修复驱动在某些2000下蓝屏的BUG 2,修复驱动的几个BUG 3,加key验证,需要StrongOD.key才能运行 [2009.03.30 v0.2.4.347] 1,修复vista下attach异常的问题 2,增强attach的稳定性,Attach后需要F9,然后resume all thread 3,advenummod支持动态卷,网络映射盘 4,vista sp1下无法打开文件bug 5,vista下父进程修改 [2009.03.17 v0.2.4.341] 1,退出OD去掉ZwOpenThread的hook 2,修复OD处理codebase会崩溃BUG 3,驱动不会影响非OD调试程序的情况 [2009.03.09 v0.2.3.328] 1,增强进程保护(保护线程),省得老毛子麻烦 2,修复一个导入表分析的错误 3,修复处理重定位表的BUG 4,修复attach notepad.exe的BUG 5,修复处理导出表的bug 6,修复处理tls的BUG [2009.02.14 v0.2.3.314] 1,修复了2003 sp1下蓝屏bug(感谢cxh852456) 2,增强快捷键兼容性,支持简单修改版的OD [2009.02.10 v0.2.3.305] 1,修复几个小BUG 2,增强attach功能 3,修复某个BUG [2009.02.04 v0.2.3.301] 1,底部快捷栏自动记录是否隐藏 2,底部状态栏显示Memory窗口状态 3,修复驱动不加载的bug [2009.02.01 v0.2.3.299] 1,增加多个内存窗口的快速切换,快捷键 alt+1 ~ alt+5 2,增加切换堆栈窗口关联到ebp寄存器或者不关联任何寄存器,快捷键 alt+1 ~ alt+3 3,增加一个底部的快捷栏,上面有快速切换的按钮,Option里面可以取消创建这个快捷栏, 如果创建后可以用Alt+R来显示,隐藏快捷栏 4,底部的快捷栏是否创建,不影响上面快速切换的功能(没有按钮可以用快捷键来切换) [2009.01.14 v0.2.2.292] 1,修复一些解析PE的小bug 2,修复内存断点判断的一个小bug [2009.01.14 v0.2.2.283] 1,修复一些小bug 2,修复驱动一个bug [2009.01.11 v0.2.2.275] 1,增加选项删除入口点断点 2,增加选项中断在Tls入口(如果有的话),必须选上Kill Pe Bug 3,增加选项中断在进ring3的第一行代码(是否实现,待定) 4,配置文件中增加OrdFirst,决定mfc42中的导出函数是序号优先还是名字优先 5,修复处理重定位表的bug 6,Attach窗口的鼠标滚轮改成WM_VSCROLL消息 [2009.01.08 v0.2.1.273] 1,修正处理导出表和导入表的bug 2,修正处理重定位表的bug 3,修复Skip Some Expection选上的候对内存段下F2断点无法正常断下的bug 4,修复Skip Some Expection选上的候内存断点无法断下的BUG 5,修复IAT中序号找不到函数名的BUG [2009.01.06 v0.2.1.262] 1,增加Attach窗口的鼠标滚轮支持 2,重写od处理模块的代码 [2008.12.30 v0.2.1.252] 1,修复驱动BUG [2008.12.25 v0.2.1.235] 1,修复一个利用PAGE_GUARD的anti 2,修复Skip Some Expection选上的候无法对内存段下F2断点 3,由于PAGE_GUARD的特殊性,无法完美处理od用PAGE_GUARD下断点的BUG,建议尽量不要对内存段下F2断点 4,加强进程保护功能,防止ring3下复制句柄打开od进程 5,修复驱动多处小bug 6,更新版本号 [2008.11.06 v0.20] 1,超长异常处理链导致OD打开太慢的BUG [2008.11.03 v0.19] 1,增加一个快捷键,cpudump 窗口 alt+左键双击 2,修复隐藏OD窗口后输入法有可能无法使用的BUG 3,修复了一个潜在的蓝屏BUG [2008.09.15 v0.18] 1,修复了Ctrl+G计算rva,offset的一个小BUG 2,当程序不是运行的状态,Detach前会先运行程序 3,修复原版OD的数据区复制BUG 4,修复od运行后CPU占用率很高的BUG 5,可以设置是否跳过一些异常处理 [2008.09.02 v0.17] 1,跳过不是OD设的Int 3中断,跳过STATUS_GUARD_PAGE,STATUS_INVALID_LOCK_SEQUENCE异常 2,正确处理int 2d指令 [2008.08.31 v0.16] 1,加入驱动,保护进程,隐藏窗口,过绝大部分反调试 2,驱动支持自定义设备名(ollydbg.ini中的DeviceName,设备名不超过8个字符) ollydbg.ini中的[StrongOD]中,可以自己设定 HideWindow=1 隐藏窗口 HideProcess=1 隐藏进程 ProtectProcess=1 保护进程 DriverKey=-82693034 和驱动通信的key DriverName=fengyue0 驱动设备名(不超过8个字符) 3,将OD创建进程的父进程改成explorer.exe (抄自shoooo的代码) [2008.08.10 v0.15] 1,增强查找模块功能(能正确查找处理过peb的模块,比如ring3的隐藏模块) 2,增强OD对文件Pe头的分析(如Upack壳等) 3,anti anti attach (一种极端的attach方式) 4,脱离目标程序不再调试(DebugActiveProcessStop)功能,xp系统以上 5,注入dll到被调试的进程 a) Remote Thread(使用CreateRemoteThread注入) b) Current Thread(shellcode,不增加线程方式注入,当前线程必须暂停) [2008.07.04 v0.14] 1,过VMP 1.64邪恶anti 下载地址:http://www.unpack.cn/viewthread.php?tid=26870 [2008.01.20 v0.13] 1,Advanced Ctrl + G 功能可以输入API名(已经和OD自带的功能一摸一样了) 2,修复了当没有断点的候会有删除所有断点的选项的BUG 3,修复了删除所有断点,有可能删不完的BUG 4,当线程小于或等于1的候,不会有Resume all thread 和 Suspend all thread选项 5,并不兼容看雪9.21版本(因为这个版本修改了ACPUASM等类名,如果自己修改的版本请不要修改ACPU这样的类名) 6,和加壳版的OD有一定的兼容性(载入将导入表写回PE头和相应的位置,但还是不支持TheODBG) [2008.01.15 v0.12] 1,增加了Advanced Ctrl + G 功能 2,将浮点bug作为选项(patch代码的,需要重启才能保存选项) 3,将原本patch的代码都取消,全部改成hook形式,增加兼容性(后续的功能将都用patch的形式做) [2007.11.15 v0.11] 去除了2个BUG: 1,启动程序,如果目录有空格会有个出错信息 2,CPU DUMP 窗口,如果选中一个内存块的第一个字节,Infoline会显示异常 增加: 如果断点窗口没有任何断点,则不显示菜单 [2007.11.14 v0.10] 增加创建进程模式 本插件提供了3种方式来启动进程: 1,Normal 和原来的启动方式相同,清掉了STARTINFO里面不干净的数据 2,CreateAsUser 用一个User权限的用户来启动进程,使进程运行在User权限下,无法对Admin建立的进程进行操作 运行这个需要在本地安全策略-用户权利指派里面将你的用户加入2个权限: 1,替换进程级记号(SeAssignPrimaryTokenPrivilege) 2,以操作系统方式操作(SeTcbPrivilege) 如果是home版的windows,无法设置,那么可以试试使用SuperMode,重启OD来提升权限,强烈不建议使用这个选项 3,CreateAsRestrict 第二个选项用User权限的用户来启动进程限制的地方比较多,所以,增加第三个功能,以一个限制级的Admin用户来启动程序 启动的程序是以Admin的用户,不过权限只剩下默认User用户有的权限,一些危险权限全部删除(包括SeDebugPrivilege,SeLoadDriverPrivilege等),这样运行的程序不会对OD造成很大的伤害。建议用这个方式启动程序。 注意: 1,新增加的这2个启动方式,不一定能运行所有的程序(比如OllyDbg)!不过在调试木马的候会有不错的效果。 2,和 Olly Advanced 插件冲突,加载了Olly Advanced 插件,此功能失效! 隐藏调试器功能 HidePEB,去掉PEB中的调试标记,并且从根本上解决了HeapMagic的问题(参考的Phant0m.dll) 此功能的选项选不选都自动隐藏 快捷键功能 1. 增加CPU ASM,CPU DUMP,CPU STACK窗口中增加Enter相关的一系列快捷键 CPU ASM窗口中 例如 1000481A |. A3 F48E0010 mov dword ptr ds:[10008EF4], eax 选中这行,按Enter, 表示在 CPU DUMP窗口显示10008EF4位置 按Shift+Enter, 表示在 CPU ASM 窗口显示10008EF4位置 按Ctrl+Enter, 表示在CPU DUMP窗口显示这行的地址1000481A位置 如果有2个立即数,比如 1000481A mov dword ptr ds:[10001000],40304C 这样的语句,如果要切换另一个立即数,就加上Alt,进行切换 选中这行,按Enter, 表示在 CPU DUMP窗口显示40304C位置 按Shift+Enter, 表示在 CPU ASM 窗口显示40304C位置 按Ctrl+Enter, 表示在 CPU DUMP窗口显示这行的地址1000481A位置 按Alt+Enter, 表示在 CPU DUMP窗口显示10001000位置 按Alt+Shift+Enter, 表示在 CPU ASM 窗口显示10001000位置 CPU DUMP窗口中 按Enter,表示在CPU ASM窗口显示选中的第一个字节开始的数据内容 按Shift+Enter,表示在CPU DUMP窗口显示选中的第一个字节开始的数据内容 按Ctrl+Enter,表示在CPU ASM窗口显示选中的第一个字节的地址 CPU STACK窗口中 按Enter,表示在CPU ASM窗口显示选中行的数据 按Shift+Enter,表示在CPU DUMP窗口显示选中行的数据 按Ctrl+Enter,表示在CPU ASM窗口显示选中行的地址 按Alt+Enter,表示在CPU DUMP窗口显示选中行的地址 2. 增加CPU ASM , CPU DUMP , CPU STACK窗口快捷键ESC和`(注:ESC下面的),此按键功能同在CPU窗口按-(减号)+(加号)功能.(方便笔记本,因为笔记本没有小键盘) 3. 增加CPU REG窗口快捷键ESC和`(注:ESC下面的)实现View FPU,View MMX,View 3D Now!,View Debug的快速翻页. 4. 增加CPU STACK窗口快捷键ESC和`(注:ESC下面的),ESC表示在CPU STACK窗口显示ESP值,`表示显示EBP的值 5. 增加CPU REG窗口快捷键CTRL+数字键1至8(分别对应EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI)将其内容显示在CPUASM窗口中 增加CPU REG窗口快捷键SHIFT+数字键1至8(分别对应EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI)将其内容显示在CPUDUMP窗口中 6. 增加CPU ASM,CPU DUMP窗口快捷键Shift+C,Shift+V,Shift+X,Ctrl+X.分别对应二进制复制,二进制粘贴,无空格二进制复制(方便写OD脚本的兄弟),复制选中的第一个字节的地址 注:Shift+V 只需要选中起始地址即可. Shift+C与Shift+X的区别如下: 55 8B EC 8B 45 0C 48 74 42 48 74 37 83 E8 0D 74 558BEC8B450C48744248743783E80D74 Ctrl+X功能是复制选中的第一个字节的地址,如选中的第一行是 1000481A mov dword ptr ds:[10001000],40304C 按Ctrl+X,则地址01000481A 复制到剪贴板 7. 增加在CPU ASM 和CPU DUMP窗口增加快捷键Insert ,Delete Insert 将选中的区域以0x90填充 Delete 将选中的区域以0x00填充 先选中一块区域,然后按键,填充完后可以用OD的恢复功能恢复(Alt + Backspace) 8. 增加状态栏显示CPU DUMP窗口中选中区域的起始地址,结束地址,选中区域大小,及当前值. 注:如CPU DUMP窗口数据为00401000 00 10 40 00 69 6E 67 20 鼠标选中地址00401000后面的00,状态栏窗口显示Value为401000,按Ctrl+双击鼠标左键复制Value到剪切板. 9. 增加断点窗口(ALT+B呼出)Delete All BreakPoints功能.实现删除全部断点. 10. 增加线程窗口Suspend All Threads,Resume All Threads功能.实现挂起和恢复全部线程. 特别感谢:fly,sucsor,lifeengines,shoooo,foxabu,hellsp@wn,okdodo,kanxue,a__p,微笑一刀,goldsun

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧