windbg - 调试栈溢出及一个崩溃示例

在开发中遇到用户的反馈的崩溃,显示的栈溢出导致,通过查看资料终于找到了相关的发生问题原因。本文会介绍

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、~* 显示崩溃线程,线程号前面的 . 表示当前的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值