【问题标题】:The thread 'Win32 Thread' has exited with code -1073740777 (0xc0000417)线程“Win32 线程”已退出,代码为 -1073740777 (0xc0000417)
【发布时间】:2015-03-20 02:28:12
【问题描述】:

我有一个调用 DLL 的可执行文件。我可以通过将 DLL 的 VS2008 项目附加到可执行文件的进程来逐步执行 DLL 代码。我已经调试了一些错误/异常。但是现在,正是当 DLL 的主函数返回时,可执行进程崩溃而没有任何错误/异常。为了调试崩溃,我尝试使用崩溃转储文件,但基于this link,看起来它们不适用于 VS2008。

我可以使用哪些工具来调试崩溃?

编辑:

进程在死亡时调用这个:

TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER);

【问题讨论】:

  • 您使用的是托管 9.Net) 代码还是本机代码? C++ 标签建议使用本机,但您链接到有关托管代码的问题。另外,究竟什么是“崩溃”?这不是一个技术术语。如果您的进程出于某种原因只是调用TerminateProcess,它会默默地消失,但这并不是真正的崩溃。
  • 崩溃转储可用于 VS 2008。when main function of DLL returns, executable process crashes without any error/exception。调试时,Visual Studio 中的“输出窗口”让您知道返回值和/或未处理的异常是什么。 VS 不会让你一无所获。
  • @MSalters 进程调用这个:TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); 这意味着进程消失还是真正的崩溃?我不确定。
  • @user3405291:这就是您最初应该在问题中提出的那种细节。

标签: visual-studio-2008 dll crash c++-cli


【解决方案1】:

TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); 强烈表明运行时库终止了您的进程,因为您将错误的参数传递给了库函数。而“坏”是如此糟糕,以至于它无法合理地继续下去。你可能没有看到像sqrt(-1.0) 这样微不足道的东西,但可能是strlen(NULL)std::sort(... , &std::equal<int>)

[编辑] 要找到根本原因,提供invalid_parameter_handler)( 会有所帮助。在其中,调用__debugbreak 来调用调试器。堆栈跟踪现在将显示原因。

【讨论】:

  • 我想知道为什么我的错误参数没有导致任何错误/异常消息。
  • Visual Studio Just-In-Time Debugger 调用堆栈意味着错误的参数被传递给fscanf,然后是vfscanf。考虑到崩溃恰好在 DLL 返回时发生,我不确定对 fscanf 的错误调用是否在 DLL 内部或可执行文件中。有什么方法可以实现吗?
  • 嗯,这可能是图书馆调用TerminateProcess 的一个很好的理由。你传递一个指向`fscanf`的指针并说“把结果放在这里”。传递一个错误的指针很可能会导致随机数据被覆盖,产生不可预测的后果。这种问题在过去导致了安全漏洞,这证明了快速退出是合理的。死进程不再是安全风险。
  • 我在 DLL 的源代码中实现了_set_invalid_parameter_handler__debugbreak(),但它无法调用调试器。我觉得fscanf 的错误参数发生在可执行文件中(我没有它的源代码)。这对我来说很有意义,因为崩溃发生在 DLL 的主函数返回之后。
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多