问题1:
问:
0 Id: 15f4.e60 Suspend: 1 Teb: 7ffdf000 Unfrozen
# ChildEBP RetAddr Args to Child
00 0012fe80 77d693f3 00456cd8 0012feec 00456cf3 ntdll!KiFastSystemCallRet
*** WARNING: Unable to verify checksum for PlayDemo.exe
*** ERROR: Symbol file could not be found. Defaulted to export symbols for PlayDemo.exe -
01 0012fe84 00456cd8 0012feec 00456cf3 0012febc USER32!NtUserWaitMessage+0xc
WARNING: Stack unwind information not available. Following frames may be wrong.
02 0012febc 004561c3 000325ea 00000113 00000001 PlayDemo!PerfgrapFinalize+0x428f8
03 0012fee4 0045644f 0012fef8 00456459 0012ff14 PlayDemo!PerfgrapFinalize+0x41de3
04 0012ff14 00401713 00000000 004c9034 002a2893 PlayDemo!PerfgrapFinalize+0x4206f
05 0012ff50 004c26f7 00400000 00000000 002a2893 PlayDemo!_GetExceptDLLinfo+0x2a6
06 0012ff88 75f51174 7ffd5000 0012ffd4 77c4b3f5 PlayDemo!PerfgrapFinalize+0xae317
07 0012ff94 77c4b3f5 7ffd5000 57cfea49 00000000 kernel32!BaseThreadInitThunk+0xe
08 0012ffd4 77c4b3c8 00401414 7ffd5000 00000000 ntdll!__RtlUserThreadStart+0x70
09 0012ffec 00000000 00401414 7ffd5000 00000000 ntdll!_RtlUserThreadStart+0x1b
问题:标红颜色的那行提示,代表我匹配不到PlayDemo的符号文件,但ntdll的符号文件我是匹配成功的,那么-->是不是我下面绿字的栈信息是不是就不对了呢?(因为PlayDemo的符号不对,栈回溯出现问题)
答案:
因为栈回溯是以递推方式产生的,上面的不对,有可能影响下面的。但这也不是绝对的,WinDBG会使用默认的规则递推寻找,有时是可能跨越模糊区域,进入到有符号的部分继续递推的。比如本例中,根据经验,绿色部分大体是正确的
问题2
问:
系统调用过函数kifastsystemcall后,在栈中会看到函数kifastsystemcallret,我原以为这个函数应包含sysexit指令,没想到却是ret指令。
lkd> u ntdll!kifastsystemcallret
ntdll!KiFastSystemCallRet:
7c92eb94 c3 ret
答案:
这是从内核态回到用户态的着陆点,此时已经回到了用户态,ret是回到用户态的父函数