在开发中遇到用户的反馈的崩溃,显示的栈溢出导致,通过查看资料终于找到了相关的发生问题原因。本文会介绍
1、栈溢出的排查过程,可能引起栈溢出原因
2、遇到栈不正确情况的处理过程
3、运气也是调试的一部分,哈哈
问题描述
程序崩溃,调试显示栈溢出
c0000409 (Security check failure or stack buffer overrun)
系统在此应用程序中检测到基于堆栈的缓冲区溢出。此超限可能会允许恶意用户控制此应用程序。
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 08f276bd (nvoglv32!vk_optimusGetInstanceProcAddr+0x000c549d)
ExceptionCode: c0000409 (Security check failure or stack buffer overrun)
ExceptionFlags: 00000001
NumberParameters: 1
Parameter[0]: 00000007
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 08f276bd (nvoglv32!vk_optimusGetInstanceProcAddr+0x000c549d)
ExceptionCode: c0000409 (Security check failure or stack buffer overrun)
ExceptionFlags: 00000001
NumberParameters: 1
Parameter[0]: 00000007
Subcode: 0x7 FAST_FAIL_FATAL_APP_EXIT
PROCESS_NAME: lec_teacher.exe
ERROR_CODE: (NTSTATUS) 0xc0000409 - <Unable to get error code text>
EXCEPTION_CODE_STR: c0000409
EXCEPTION_PARAMETER1: 00000007
STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
0813ec98 08ba784f 6e760038 00000000 00000000 nvoglv32!vk_optimusGetInstanceProcAddr+0xc549d
0813ecec 08ba79b0 0c870048 0c870048 00000000 nvoglv32!DrvPresentBuffers+0x2971f
0813ed34 08c830d8 0c870048 00000045 0c870048 nvoglv32!DrvPresentBuffers+0x29880
0813ed50 08c8853a 0000ffff 0c870048 0000005b nvoglv32!DrvPresentBuffers+0x104fa8
0813ed70 08c7739d 0c870048 00000045 0c870048 nvoglv32!DrvPresentBuffers+0x10a40a
0813f030 08c77dbc 01870048 0813fba0 0813f200 nvoglv32!DrvPresentBuffers+0xf926d
0813f1bc 081f85f2 0013f601 0c870048 0813f6a4 nvoglv32!DrvPresentBuffers+0xf9c8c
0813f218 08b56073 00000001 00000001 00000001 nvoglv32+0xb85f2
0813f248 08c5b992 16eac138 0813f6a4 0c870048 nvoglv32!DrvValidateVersion+0x5e93
0813f688 0820ef6d 0c870048 0813f6a4 00000002 nvoglv32!DrvPresentBuffers+0xdd862
0813fdfc 08930061 01000000 00000000 00000000 nvoglv32+0xcef6d
0813fe3c 0830d1d2 00000000 00000000 00000140 nvoglv32+0x7f0061
0813fe64 088fe217 00000000 00000000 00000140 nvoglv32+0x1cd1d2
0813fea8 089ea0fb 0a3b1040 00000000 00000d44 nvoglv32+0x7be217
0813fee0 089e9e2f 0a3b1040 08b5b100 08b5b100 nvoglv32+0x8aa0fb
0813fef8 08b5b122 0a867540 07e40080 0813ff18 nvoglv32+0x8a9e2f
0813ff08 75d26359 0a867540 75d26340 0813ff74 nvoglv32!DrvValidateVersion+0xaf42
0813ff18 778a7c24 0a867540 59857cfe 00000000 kernel32!BaseThreadInitThunk+0x19
0813ff74 778a7bf4 ffffffff 778c8ff3 00000000 ntdll!__RtlUserThreadStart+0x2f
0813ff84 00000000 08b5b100 0a867540 00000000 ntdll!_RtlUserThreadStart+0x1b
如何调试栈溢出
引起调用栈溢出错误
堆栈溢出是用户模式线程可能遇到的错误。有三个可能的原因导致此错误:
-
线程使用为其保留的整个堆栈。这通常是由无限递归引起的。
-
线程无法扩展堆栈,因为页面文件已用完,因此无法提交任何其他页面来扩展堆栈。
-
线程无法扩展堆栈,因为系统在用于扩展页面文件的短暂时间内。
排查过程
1、~* 显示崩溃线程,线程号前面的 . 表示当前的