应用程序加载模块时闪退
C/C++本地代码调试
应用程序加载模块时闪退
BianChengNan
2015-09-09, 19:47 下午
如题,用nsis生成了一个安装包(木有安装包的符号文件),在某些机器上会出现双击运行闪退的情况。
用windbg调试的部分结果,已经通过sxe ld设置了加载模块的断点,几次试验后发现加载SHLWAPI.dll这里总是有问题。
g
ModLoad: 75830000 75887000 C:\Windows\syswow64\SHLWAPI.dll
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=7efdd000 edi=0018f4a8
eip=76f2fc5e esp=0018f37c ebp=0018f3d0 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ntdll!ZwMapViewOfSection+0x12:
76f2fc5e 83c404 add esp,4
0:000> kn
# ChildEBP RetAddr
00 0018f37c 76f4a3f8 ntdll!ZwMapViewOfSection+0x12
01 0018f3d0 76f4b0ca ntdll!LdrpMapViewOfSection+0xc7
02 0018f4c4 76f4cda4 ntdll!LdrpFindOrMapDll+0x345
03 0018f734 76f4d534 ntdll!LdrpLoadImportModule+0x287
04 0018f764 76f4d5ac ntdll!LdrpHandleOneOldFormatImportDescriptor+0x88
05 0018f778 76f4d4a7 ntdll!LdrpHandleOldFormatImportDescriptors+0x1c
06 0018f800 76f4b44b ntdll!LdrpProcessStaticImports+0x256
07 0018fa60 76f4d534 ntdll!LdrpLoadImportModule+0x340
08 0018fa90 76f4d5ac ntdll!LdrpHandleOneOldFormatImportDescriptor+0x88
09 0018faa4 76f4d4a7 ntdll!LdrpHandleOldFormatImportDescriptors+0x1c
0a 0018fb2c 76f56c06 ntdll!LdrpProcessStaticImports+0x256
0b 0018fcb0 76f5584d ntdll!LdrpInitializeProcess+0x120d
0c 0018fd00 76f49239 ntdll!_LdrpInitialize+0x78
0d 0018fd10 00000000 ntdll!LdrInitializeThunk+0x10
0:000> r
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=7efdd000 edi=0018f4a8
eip=76f2fc5e
esp=0018f37c ebp=0018f3d0 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ntdll!ZwMapViewOfSection+0x12:
76f2fc5e 83c404 add esp,4
0:000>
t
eax=00000000 ebx=00000000 ecx=41e00000 edx=0008e3c8 esi=fffffffe edi=00000000
eip=76fb129b esp=0018fb08 ebp=0018fb34 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ntdll!LdrpDoDebuggerBreak+0x2c:
76fb129b cc int 3
通过r命令看到当前eip的值是
76f2fc5e 83c404 add esp,4
但是t一下,居然就到了
76fb129b cc int 3
实在想不通什么情况会导致这么诡异的问题。
现有疑问如下:
1. 我明明设置了windbg为默认调试器,AeDebug下的Auto也设置成1了,但是双击有问题的exe还是闪退(难道没产生异常?被我下面的实验否定了)
2. 我用windbg启动有问题的exe,sxe ld这样一点一点的调,定位到加载shlwapi.dll的时候报告了一个int 3,说明触发了异常,但是为啥1中未跳到windbg中呢?
3. 一般这种问题会是什么原因引起的呢?什么样的情况,应用程序非正常退出却不跳到调试器里?难道系统哪里有设置?
附件是dmp,有兴趣的朋友可以帮忙看看,多谢啦!(额,附件不能传dmp文件)
补充:后来想起来了,应该是没触发断点(有调试器的时候才会触发一个int 3,辅助调试)说以上面的疑问1和2应该是没有发生任何异常。