Re: 请教大家个问题
C/C++本地代码调试
请教大家个问题
dabang
2009-08-17, 13:15 下午
最近在调试一个界面程序时发现,程序退出后,进程仍然存在。用windbg附加到该进程后,发现所有现有的线程的堆栈的最高层都是KiFastSystemCallRet,这个函数不是线程退出时的函数么?为什么执行到这个函数后,进程会不退出呢?
BTW:如果对于那些关闭了界面(窗口之类的全关闭了),但是进程仍然存在的原因是什么啊?
提前感谢大家的回复。
Re: 请教大家个问题
格蠹老雷
2009-08-17, 21:37 下午
当一个线程调用系统服务而进入到内核态执行时,用户态的程序指针所指向的就是KiFastSystemCallRet,因为从用户态的角度来看,一回到用户态,执行的就是个地方。
所以楼主描述的情况是比较典型的挂在内核态,也就是你的线程在调用系统服务时没有返回,如果不返回,那么进程就不能退出,而且这样的进程无法杀掉,就是通常所谓的杀不掉的进程。
如果要想知道原因,那么看栈回溯,看调用的那个系统服务,而后要想知道为什么不返回,那么要看内核态了,使用本地内核调试、或者看内核转储。
Re: 请教大家个问题
dabang
2009-08-18, 21:27 下午
感谢张老师的答复。
从调用堆栈上看没有调用系统服务啊,而且该进程可以被procexp杀死,好像也可以用windows自带的任务管理器来杀掉。
Re: 请教大家个问题
格蠹老雷
2009-08-18, 21:51 下午
不客气,不妨将栈回溯贴上来看一下。
Re: 请教大家个问题
dabang
2009-08-19, 14:10 下午
张老师:
下面是使用!analyze -v分析的该dump文件:
==============================================
FAULTING_IP:
+2d3952f0280df74
00000000 ?? ???
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 00000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0
FAULTING_THREAD: 00001244
DEFAULT_BUCKET_ID: HEAP_CORRUPTION
PROCESS_NAME: SoftDA.exe
FAULTING_MODULE: 7c930000 ntdll
DEBUG_FLR_IMAGE_TIMESTAMP: 0
ERROR_CODE: (NTSTATUS) 0x80000003 - { }
EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) -
ADDITIONAL_DEBUG_TEXT:
Use '!findthebuild' command to search for the target build information.
If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols. ; Enable Pageheap/AutoVerifer
PRIMARY_PROBLEM_CLASS: HEAP_CORRUPTION
BUGCHECK_STR: APPLICATION_FAULT_HEAP_CORRUPTION_WRONG_SYMBOLS
LAST_CONTROL_TRANSFER: from 7c96d281 to 7c9585ec
STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
0179f844 7c96d281 0000028c 00000004 7c88b7c0 ntdll!KiFastSystemCallRet
0179f864 7c822372 7c88b7c0 04e00000 05573ad8 ntdll!RtlLockHeap+0x25c
0179fa98 04e5ae77 04d976f4 04e53927 00000001 kernel32!SetEvent+0x61
0179fae0 04e53b41 00000000 00000000 00000001 YLUSBTEL!YL_DeviceIoControl+0x4d087
0179fb08 04e4feae 04e00000 00000000 00000000 YLUSBTEL!YL_DeviceIoControl+0x45d51
0179fb48 04e4ff18 04e00000 7c94a352 04e00000 YLUSBTEL!YL_DeviceIoControl+0x420be
0179fb70 7c969dee 04e4fefb 04e00000 00000000 YLUSBTEL!YL_DeviceIoControl+0x42128
0179fc84 7c82b1bb 04370000 0179fdb0 0179fea0 ntdll!RtlOpenCurrentUser+0x168
0179fc98 774d1d0f 04370000 0179fec4 774d1d23 kernel32!FreeLibrary+0x1a
0179fca4 774d1d23 0179fdbc 00000000 775d65b0 ole32!CreateErrorInfo+0x11d0
0179fec4 774fb97d ffffffff 0004fe60 00072a94 ole32!CreateErrorInfo+0x11e4
0179fed4 7750249c ffffffff 00000000 008fea6f ole32!CoFreeUnusedLibrariesEx+0x2e
0179fee0 008fea6f 00072a94 008fea8d 00000000 ole32!CoFreeUnusedLibraries+0x9
00000000 00000000 00000000 00000000 00000000 SoftDA+0x4fea6f
SYMBOL_NAME: heap_corruption!heap_corruption
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: heap_corruption
IMAGE_NAME: heap_corruption
STACK_COMMAND: .cxr 00000000 ; kb ; ~0s; .ecxr ; kb
FAILURE_BUCKET_ID: HEAP_CORRUPTION_80000003_heap_corruption!heap_corruption
BUCKET_ID: APPLICATION_FAULT_HEAP_CORRUPTION_WRONG_SYMBOLS_heap_corruption!heap_corruption
WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/SoftDA_exe/1_2_5_3/4a80d148/unknown/0_0_0_0/bbbbbbb4/80000003/00000000.htm?Retriage=1
Followup: MachineOwner
=================================================
看样子是堆分配错误,但是看不到哪里有问题