本文介绍了Windows发行版中的std :: ifstream崩溃,退出代码为0xC0000409:未知软件异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 std :: ifstream :

printf("Before stream initialization\n");
ifstream stream(file_path, ios::binary);
printf("Stream initialized\n");
ifstream::pos_type position = stream.tellg();
auto file_size = position;
printf("Position acquired\n");

但是,该程序在二进制文件的释放模式下崩溃.这是已编译的汇编代码片段:

However, the program crashes in the release mode of the binary. Here is the compiled assembly code snippet:

.text:0000000000413411                 lea     rcx, aBeforeStreamIn ; "Before stream initialization\n"
.text:0000000000413418                 mov     rbx, rax
.text:000000000041341B                 call    _ZL6printfPKcz  ; printf(char const*,...)
.text:000000000041341B ;   } // starts at 41340C
.text:0000000000413420                 lea     rdi, [rsp+878h+var_248]
.text:0000000000413428                 lea     rcx, [rdi+0D8h] ; this
.text:000000000041342F                 mov     [rsp+878h+var_820], rdi
.text:0000000000413434                 call    _ZNSt8ios_baseC1Ev ; std::ios_base::ios_base(void)
.text:0000000000413439                 xor     r8d, r8d
.text:000000000041343C                 mov     rax, cs:_refptr__ZTVSt9basic_iosIcSt11char_traitsIcEE
.text:0000000000413443                 xor     edx, edx
.text:0000000000413445                 mov     [rsp+878h+var_90], r8w
.text:000000000041344E                 pxor    xmm0, xmm0
.text:0000000000413452                 movaps  [rsp+878h+var_88], xmm0
.text:000000000041345A                 movaps  [rsp+878h+var_78], xmm0
.text:0000000000413462                 mov     [rsp+878h+var_98], 0
.text:000000000041346E                 add     rax, 10h
.text:0000000000413472                 mov     [rsp+878h+var_170], rax
.text:000000000041347A                 mov     rax, cs:_refptr__ZTTSt14basic_ifstreamIcSt11char_traitsIcEE
.text:0000000000413481                 mov     rsi, [rax+8]
.text:0000000000413485                 mov     rcx, [rax+10h]
.text:0000000000413489                 mov     rax, [rsi-18h]
.text:000000000041348D                 mov     [rsp+878h+var_248], rsi
.text:0000000000413495                 mov     [rsp+878h+var_7E8], rcx
.text:000000000041349D                 mov     [rsp+878h+var_7F0], rsi
.text:00000000004134A5                 mov     [rsp+rax+878h+var_248], rcx
.text:00000000004134AD                 mov     [rsp+878h+var_240], 0
.text:00000000004134B9                 mov     rcx, [rsi-18h]
.text:00000000004134BD                 add     rcx, rdi
.text:00000000004134C0 ;   try {
.text:00000000004134C0                 call    _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E ; std::basic_ios<char,std::char_traits<char>>::init(std::basic_streambuf<char,std::char_traits<char>> *)
.text:00000000004134C0 ;   } // starts at 4134C0
.text:00000000004134C5                 mov     rax, cs:_refptr__ZTVSt14basic_ifstreamIcSt11char_traitsIcEE
.text:00000000004134CC                 lea     rcx, [rdi+10h]
.text:00000000004134D0                 add     rax, 18h
.text:00000000004134D4                 mov     [rsp+878h+var_248], rax
.text:00000000004134DC                 mov     rax, cs:_refptr__ZTVSt14basic_ifstreamIcSt11char_traitsIcEE
.text:00000000004134E3                 add     rax, 40h
.text:00000000004134E7                 mov     [rsp+878h+var_170], rax
.text:00000000004134EF ;   try {
.text:00000000004134EF                 call    _ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev ; std::basic_filebuf<char,std::char_traits<char>>::basic_filebuf(void)
.text:00000000004134EF ;   } // starts at 4134EF
.text:00000000004134F4                 lea     rdx, [rdi+10h]
.text:00000000004134F8                 lea     rcx, [rdi+0D8h]
.text:00000000004134FF ;   try {
.text:00000000004134FF                 call    _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E ; std::basic_ios<char,std::char_traits<char>>::init(std::basic_streambuf<char,std::char_traits<char>> *)
.text:0000000000413504                 lea     rcx, [rdi+10h]
.text:0000000000413508                 mov     r8d, 0Eh
.text:000000000041350E                 mov     rdx, rbx
.text:0000000000413511                 call    _ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode ; std::basic_filebuf<char,std::char_traits<char>>::open(char const*,std::_Ios_Openmode)
.text:0000000000413516                 mov     rdx, [rsp+878h+var_248]
.text:000000000041351E                 add     rdi, [rdx-18h]
.text:0000000000413522                 test    rax, rax
.text:0000000000413525                 mov     rcx, rdi
.text:0000000000413528                 jz      loc_414688
.text:000000000041352E                 xor     edx, edx
.text:0000000000413530                 call    _ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate ; std::basic_ios<char,std::char_traits<char>>::clear(std::_Ios_Iostate)
.text:0000000000413530 ;   } // starts at 4134FF
.text:0000000000413535
.text:0000000000413535 loc_413535:                             ; CODE XREF: PointerSearcher::parse_pointer_map(void)+1363↓j
.text:0000000000413535                 lea     rcx, aStreamInitiali ; "Stream initialized\n"
.text:000000000041353C ;   try {
.text:000000000041353C                 call    _ZL6printfPKcz  ; printf(char const*,...)

在我的函数中,它在以下行崩溃:

In my function it crashes at this line:

.text:0000000000413504                 lea     rcx, [rdi+10h]

输出为:

Before stream initialization

Process finished with exit code -1073741819 (0xC0000409)

堆栈跟踪为:

std::locale::operator=(std::locale const&)
std::ios_base::_M_init()
std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*)
MyExecutable::myFunction()

崩溃仅发生在 Windows 二进制文件中.该二进制文件适用于 Linux 的发布模式.我正在使用 MinGW 编译器来编译Windows二进制文件,并且编译标志为:

The crash only happens in the Windows binary. The binary works in release mode for Linux. I'm using the MinGW compiler to compile the Windows binary and the compilation flags are:

-fopenmp -O3 -DNDEBUG

它们是默认的 CMake 版本构建标记.我还确保传递的 file_path 是正确的.

They're the default CMake release build flags. I also made sure the passed file_path is correct.

gdb 说:

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00000000004a2521 in std::locale::operator=(std::locale const&) ()

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00000000004a2521 in std::locale::operator=(std::locale const&) ()
[Thread 48616.0xc508 exited with code 3221225477]
[Thread 48616.0xc510 exited with code 3221225477]
[Thread 48616.0xc638 exited with code 3221225477]
[Inferior 1 (process 48616) exited with code 030000000005]

编译器版本:

"C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin\x86_64-w64-mingw32-gcc.exe" --version
x86_64-w64-mingw32-gcc.exe (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

有人知道出了什么问题以及如何解决吗?

Does anyone have an idea what went wrong and how to fix it?

推荐答案

这似乎是 MinGW 编译器错误,因为在 Visual Studio 中使用 MSVC 编译代码时,也不会发生相同的异常.

This seems to be a MinGW compiler bug since when using MSVC in Visual Studio to compile the code, the same exception does not occur either.

这篇关于Windows发行版中的std :: ifstream崩溃,退出代码为0xC0000409:未知软件异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-24 16:28