gpt4 book ai didi

exception-handling - 如何识别 STATUS_INVALID_CRUNTIME_PARAMETER 异常

转载 作者:行者123 更新时间:2023-12-05 03:11:04 27 4
gpt4 key购买 nike

平台是 Windows 7 SP1。

我最近花了一些时间调试一个问题,该问题是由于代码将无效参数传递给“安全”CRT 函数之一而引起的。结果,我的应用程序立即中止,没有任何警告或任何东西——甚至没有崩溃对话框。

起初,我试图通过将 Windbg 附加到我的应用程序来解决这个问题。然而,当崩溃发生时,当代码闯入 Windbg 时,除了 Windbg 必须闯入的一个线程外,几乎每个线程都被杀死了。不知道哪里出了问题。因此,我改为附加 Visual Studio 作为调试器,当我的应用程序终止时,我看到每个线程都退出,错误代码为 0xc0000417让我知道某处存在无效参数问题。

接下来,我尝试调试它的方法是再次将 Windbg 附加到我的应用程序,但这次随机(通过反复试验)在不同的地方放置断点,例如 kernel32!TerminateThreadkernel32!UnhandledExceptionFilterkernel32!SetUnhandledExceptionFilter

其中,在 SetUnhandledExceptionFilter 处放置一个断点会立即显示崩溃发生时违规线程的调用堆栈以及我们错误调用的 CRT 函数。

问题:有什么直观的东西告诉我应该立即将 bp 放在 SUEF 上吗?我想更好地理解这一点,而不是通过反复试验来做到这一点。第二个问题是关于我通过 Visual Studio 确定的错误代码。在不借助 VS 的情况下,如何确定 Windbg 上的线程退出代码?

最佳答案

我只是想发表评论,但这个变得更大了,所以一个答案

使用 Windbg -I 将 windbg 设置为事后调试器也会将所有未处理的异常路由到 windbg

Windbg - 我应该将 windbg 注册为事后调试器
默认情况下,AeDebug 注册表项中的 Auto 设置为 1
如果您不想调试每个程序,您可以将其编辑为 0
在 wer 对话框中为您提供额外的 DoYouWanttoDebug 选项

reg query "hklm\software\microsoft\windows nt\currentversion\aedebug"

HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\aedebug
Debugger REG_SZ "xxxxxxxxxx\windbg.exe" -p %ld -e %ld -g
Auto REG_SZ 0

假设您注册了事后调试器并运行此代码

#include <stdio.h>
#include <stdlib.h>
int main (void)
{
unsigned long input[] = {1,45,0xf001,0xffffffff};
int i = 0;
char buf[5] = {0};
for(i=0;i<_countof(input);i++)
{
_ultoa_s(input[i],buf,sizeof(buf),16);
printf("%s\n",buf);
}
return 1;
}

在异常情况下你会看到这样的对话框

enter image description here

你现在可以选择调试这个程序

windows 还将未处理异常的退出代码写入事件日志

你可以像这样使用 powershell 检索一个事件

PS C:\> Get-EventLog -LogName Application -Source "Application Error" -newest 1| format-list


Index : 577102
EntryType : Error
InstanceId : 1000
Message : Faulting application name:
ultos.exe, version: 0.0.0.0, time stamp: 0x577680f1
Faulting module name: ultos.exe, version:
0.0.0.0, time stamp: 0x577680f1
Exception code: 0xc0000417
Fault offset: 0x000211c2
Faulting process id: 0x4a8
Faulting application start time: 0x01d1d3aaf61c8aaa
Faulting application path: E:\test\ulto\ultos.exe
Faulting module path: E:\test\ulto\ultos.exe
Report Id: 348d86fc-3f9e-11e6-ade2-005056c00008
Category : Application Crashing Events
CategoryNumber : 100
ReplacementStrings : {ultos.exe, 0.0.0.0, 577680f1, ultos.exe...}
Source : Application Error
TimeGenerated : 7/1/2016 8:42:21 PM
TimeWritten : 7/1/2016 8:42:21 PM
UserName :

如果你选择调试

可以查看CallStack

0:000> kPL
# ChildEBP RetAddr
00 001ffdc8 77cf68d4 ntdll!KiFastSystemCallRet
01 001ffdcc 75e91fdb ntdll!NtTerminateProcess+0xc
02 001ffddc 012911d3 KERNELBASE!TerminateProcess+0x2c
03 001ffdec 01291174 ultos!_invoke_watson(
wchar_t * expression = 0x00000000 "",
wchar_t * function_name = 0x00000000 "",
wchar_t * file_name = 0x00000000 "",
unsigned int line_number = 0,
unsigned int reserved = 0)+0x31
04 001ffe10 01291181 ultos!_invalid_parameter(
wchar_t * expression = <Value unavailable error>,
wchar_t * function_name = <Value unavailable error>,
wchar_t * file_name = <Value unavailable error>,
unsigned int line_number = <Value unavailable error>,
unsigned int reserved = <Value unavailable error>)+0x7a
05 001ffe28 0128ad96 ultos!_invalid_parameter_noinfo(void)+0xc
06 001ffe3c 0128affa ultos!common_xtox<unsigned long,char>(
unsigned long original_value = 0xffffffff,
char * buffer = 0x001ffea4 "",
unsigned int buffer_count = 5,
unsigned int radix = 0x10,
bool is_negative = false)+0x58
07 001ffe5c 0128b496 ultos!common_xtox_s<unsigned long,char>(
unsigned long value = 0xffffffff,
char * buffer = 0x001ffea4 "",
unsigned int buffer_count = 5,
unsigned int radix = 0x10,
bool is_negative = false)+0x59
08 001ffe78 012712b2 ultos!_ultoa_s(
unsigned long value = 0xffffffff,
char * buffer = 0x001ffea4 "",
unsigned int buffer_count = 5,
int radix = 0n16)+0x18
09 001ffeac 0127151b ultos!main(void)+0x52
0a (Inline) -------- ultos!invoke_main+0x1d
0b 001ffef8 76403c45 ultos!__scrt_common_main_seh(void)+0xff
0c 001fff04 77d137f5 kernel32!BaseThreadInitThunk+0xe
0d 001fff44 77d137c8 ntdll!__RtlUserThreadStart+0x70
0e 001fff5c 00000000 ntdll!_RtlUserThreadStart+0x1b

关于exception-handling - 如何识别 STATUS_INVALID_CRUNTIME_PARAMETER 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38135608/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com