代码之家  ›  专栏  ›  技术社区  ›  BullyWiiPlaza

std::ifstream在Windows上的版本生成中崩溃,退出代码为0xc000409:未知软件异常

  •  -2
  • BullyWiiPlaza  · 技术社区  · 6 年前

    我在用 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");
    

    但是,程序在二进制文件的释放模式下崩溃。下面是编译的程序集代码段:

    .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*,...)
    

    在我的函数中,它在这一行崩溃:

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

    输出为:

    Before stream initialization
    
    Process finished with exit code -1073741819 (0xC0000409)
    

    stacktrace是:

    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二进制文件的编译器和编译标志是:

    -fopenmp -O3 -DNDEBUG
    

    他们是默认的 CMake 释放生成标志。我也确保通过了 file_path 是正确的。

    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.
    

    有人知道哪里出了问题,怎么解决吗?

    1 回复  |  直到 6 年前
        1
  •  -1
  •   BullyWiiPlaza    6 年前

    这好像是 MinGW 使用时的编译器错误 MSVC 在里面 Visual Studio 要编译代码,同样的异常也不会发生。