2023年1月

我的应用程序,一个可执行文件,正在远程计算机上崩溃。我没有访问那台机器的权限,所以我请求了一个转储,通过任务管理器生成。使用WEBBG,在执行命令!analyze -v时,我可以看到许多其他的文本

EXCEPTION_RECORD:  (.exr -1)
ExceptionAddress: 0000000000000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0


我怎么知道它是不是对坠机事件负责?如果不是,我如何确定真正的原因?

 int3断点是根本原因吗?

我一直想知道更多关于这个问题的信息,但运气不太好。我一直在读,应用程序不应该出现这个错误,它不告诉我什么可以导致这个错误出现。我知道这个问题非常宽泛,因为我确信这个错误可能有多种原因,所以我会尽量缩小范围。我在VS2015中开发了一个使用C++ .NET的应用程序。应用程序主要使用非托管代码,很少使用托管代码(由于垃圾收集器的严重干扰)。所以我认为95%是非托管的,5%是托管的。我在某个地方读到过,不稳定/错误/不正确的非托管代码可能会扰乱CLR内存的某些部分,使其损坏并引发此错误。由于95%的应用程序是非托管的,我不知道从哪里开始查找。可能是少数几个在托管和非托管之间交互的类?如何将数据从托管封送到非托管?错误的空指针会导致此失败吗?还有什么问题会导致这种情况?数组索引越界?空对象呢?
如果您能提供有关System.ExecutionEngine故障可能原因的详细列表,我们将不胜感激!可能原因/情况列表如下:

  • C++与C语言的参数失配
  • 使用反射时
  • WCF服务试图在此处返回IList或IEnumerable
  • 使用分析工具
  • 在汇编程序中使用std指令
  • 多次调用::FreeLibrary()
  • .NET剪贴板调用
  • 使用统一框架
  • 使用错误的封送处理
  • 使用INotifyPropertyChanged

什么是FileNotFoundException?

尝试访问磁盘上不存在的文件失败时引发的异常。如果你的代码没有 PathDiscovery 的权限,则此异常的错误消息可能只包含文件或目录名称,而不是完全限定的路径。

继承


如果您有一个WER处理过的崩溃进程,但您知道JIT调试器设置错误,或者根本没有设置(因此崩溃对话框上没有“调试”按钮),则可以保持对话框打开,并将您选择的任何调试器附加到挂起的崩溃进程。
不过,有个问题。通过将调试器附加到挂起的进程,进程的最后异常信息已丢失;这是因为调试器成功附加到挂起(或挂起)进程的方式是插入一个新的正在运行的线程并使该线程崩溃。因此,调试器及其使用.dump生成的任何小型转储都将无法找到原始程序的异常信息。哎呀!怎么办?
从kb的堆栈跟踪开始:

RetAddr           : Args to Child                                                           : Call Site
000007f9`d88212d2 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!NtWaitForMultipleObjects+0xa
000007f9`dae8d20e : 00000000`02300000 000007f6`96e75000 00000000`00000000 00000000`000001dc : KERNELBASE!WaitForMultipleObjectsEx+0xe5
000007f9`dae8cfd2 : fffff8a0`00000080 00000000`80004005 00000000`000001ec 00000000`00000000 : KERNEL32!WerpReportFaultInternal+0x1fa
000007f9`d889fc87 : 00000000`00000000 00000000`00195c30 00000000`00000030 00000000`00195c30 : KERNEL32!WerpReportFault+0x42
000007f9`db56a43d : 00000001`00000000 00000000`00196990 00000000`0019f620 00000000`003441d0 : KERNELBASE!UnhandledExceptionFilter+0x1d7
000007f9`db4b4ad4 : 000007f9`d8eeabdd 00000000`00196990 00000000`00000000 00000000`00000000 : ntdll!LdrpLogFatalUserCallbackException+0x4d
000007f9`db4d464d : 00000000`00000000 00000000`00195de8 00000000`00195da0 000007f9`d8f7f000 : ntdll!KiUserCallbackDispatcherHandler+0x20
000007f9`db4d567c : 000007f9`d8ee0000 00000000`0019f5c0 000007f9`0000e4f0 00000000`00000000 : ntdll!RtlpExecuteHandlerForException+0xd
000007f9`db4b4bba : 00000000`00000000 00000000`00000000 000007f6`96e7e300 00000000`00000000 : ntdll!RtlDispatchException+0x392
000007f9`db4b2acd : 000007f9`d8bbc36c 00000000`00360f00 00000000`00360f00 00000000`00360f00 : ntdll!KiUserExceptionDispatch+0x2e
000007f9`d8bbc36c : 00000000`00360f00 00000000`00360f00 00000000`00360f00 00000000`00000000 : ntdll!memcpy+0x21a

EXCEPTION_POINTERS结构地址似乎作为调用KERNEL32!WerpReportFault的参数2和4传递。由此,可以显示异常和上下文记录-但我们只需要在小型转储中包含异常指针地址,因为添加这一地址将允许 !analyze命令以工作。
使用命令“.dump/ma/xp 00195c30 dump.dmp”创建小型转储,就完成了。

 

简介

STATUS_INVALID_PARAMETER,值为0xC000000D。代表的意思是把一个无效的参数传递给了服务或函数(这里的服务是指Windows系统自身的服务,函数是指Windows系统内核函数)。它定义在 ntstatus.h头文件里,如下:

//
// MessageId: STATUS_INVALID_PARAMETER
//
// MessageText:
//
// An invalid parameter was passed to a service or function.
//
#define STATUS_INVALID_PARAMETER         ((NTSTATUS)0xC000000DL)    // winnt

异常填充结构

ExceptionAddress: 778e199f (ntdll!TppRaiseInvalidParameter+0x00000037)
ExceptionCode: c000000d//异常代码
ExceptionFlags: 00000000//这是一个可继续的异常
NumberParameters: 0