【问题标题】:how to debug large executables with mingw-w64如何使用 mingw-w64 调试大型可执行文件
【发布时间】:2021-03-12 12:46:46
【问题描述】:

我正在尝试在 Windows 上使用 mingw-w64 编译器调试我的可执行版本,并注意到以下情况:当您编译大量使用模板的大型源文件时,您可能会收到 File too big/too many sections 错误。解决方案是添加选项-Wa,-mbig-obj。但是,如果我这样做,我会收到以下错误:

{standard input}: Assembler messages:
{standard input}: Fatal error: can't close myexe.exe.p/src_session.cpp.obj: file too big

据我所知,在 windows 上使用 mingw-w64 编译器构建如此大的可执行文件时存在某些限制(当然,出于调试目的,在发布模式下没有问题)。

我想出了一些关于如何解决这个问题的想法,但在我描述它们之前,请注意我的项目结构

.
├── src
|   └── session.cpp
├── include
|   ├── scope.hpp
│   └── session.hpp
├── subprojects
│   ├── somesubproject
│   └── anothersubproject
└── meson.build

简单地说,我的项目涉及一些模板化程度很高的子项目,我认为这会导致这里出现问题(例如这个 MQTT 存储库https://github.com/redboltz/mqtt_cpp)。我根本不需要我的子项目的任何调试信息,我只需要我自己的文件session.hpp, session.hpp, session.cpp 的调试信息。是否可以只为某些文件打开调试信息,即除了子项目之外的所有文件?

有效的解决方法是在等效的 archlinux docker 容器上编译和调试我的项目吗?我会在 Linux 上遇到同样的问题吗?

该项目使用-Og 标志毫不费力地编译,但这不是我想要的,因为编译优化了很多有趣的东西。

在这里你可以找到我使用的编译器指令

[1/4] "C:\msys64\mingw64\bin\g++" "-Ialosaclient.exe.p" "-I." "-I.." "-I..\include"   
"-Isubprojects\alosa1_common" "-I..\subprojects\alosa1_common" "-I..\subprojects\alosa1_common\include"  
"-I..\subprojects\hana\include" "-I..\subprojects\mqtt_cpp\include" 
"-I..\subprojects\tomlplusplus\include" "-I..\subprojects\pybind11\include" 
"-I..\subprojects\spdlog\include" "-IC:/msys64/mingw64/include" 
"-IC:/msys64/mingw64/include/python3.8" "-fdiagnostics-color=always" "-pipe" "-D_FILE_OFFSET_BITS=64" 
"-std=c++17" "-g" "-Wa,-mbig-obj" "-DBOOST_ALL_NO_LIB" "-pthread" "-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT"
"-MD" "-MQ" alosaclient.exe.p/mqtt_pch.hpp.gch "-MF" "alosaclient.exe.p\mqtt_pch.hpp.gch.d" 
-o alosaclient.exe.p/mqtt_pch.hpp.gch "-c" ../pch/mqtt_pch.hpp
[2/4] "C:\msys64\mingw64\bin\g++" "-Ialosaclient.exe.p" "-I." "-I.." "-I..\include"  
"-Isubprojects\alosa1_common" "-I..\subprojects\alosa1_common" 
"-I..\subprojects\alosa1_common\include" "-I..\subprojects\hana\include" 
"-I..\subprojects\mqtt_cpp\include" 
"-I..\subprojects\tomlplusplus\include" "-I..\subprojects\pybind11\include" 
"-I..\subprojects\spdlog\include" "-IC:/msys64/mingw64/include" "-IC:/msys64/mingw64/include/python3.8" "-fdiagnostics-color=always" "-pipe" "-D_FILE_OFFSET_BITS=64" "-std=c++17" "-g" "-Wa,-mbig-obj" 
"-DBOOST_ALL_NO_LIB" "-pthread" "-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT" "-fpch-preprocess" "-include" "mqtt_pch.hpp" -MD -MQ alosaclient.exe.p/subprojects_alosa1_common_src_common_crc32.cpp.obj 
-MF "alosaclient.exe.p\subprojects_alosa1_common_src_common_crc32.cpp.obj.d" 
-o alosaclient.exe.p/subprojects_alosa1_common_src_common_crc32.cpp.obj "-c" ../subprojects/alosa1_common/src/common/crc32.cpp
[3/4] "C:\msys64\mingw64\bin\g++" "-Ialosaclient.exe.p" "-I." "-I.." "-I..\include" 
"-Isubprojects\alosa1_common" "-I..\subprojects\alosa1_common" 
"-I..\subprojects\alosa1_common\include" "-I..\subprojects\hana\include" 
"-I..\subprojects\mqtt_cpp\include" "-I..\subprojects\tomlplusplus\include" 
"-I..\subprojects\pybind11\include" "-I..\subprojects\spdlog\include" "-IC:/msys64/mingw64/include" 
"-IC:/msys64/mingw64/include/python3.8" "-fdiagnostics-color=always" "-pipe" "-D_FILE_OFFSET_BITS=64" 
"-std=c++17" "-g" "-Wa,-mbig-obj" "-DBOOST_ALL_NO_LIB" "-pthread" 
"-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT" "-fpch-preprocess" 
"-include" "mqtt_pch.hpp" -MD -MQ alosaclient.exe.p/src_session.cpp.obj 
-MF "alosaclient.exe.p\src_session.cpp.obj.d" -o alosaclient.exe.p/src_session.cpp.obj "-c" ../src/session.cpp
FAILED: alosaclient.exe.p/src_session.cpp.obj
"C:\msys64\mingw64\bin\g++" "-Ialosaclient.exe.p" "-I." "-I.." "-I..\include" "-Isubprojects\alosa1_common" "-I..\subprojects\alosa1_common" "-I..\subprojects\alosa1_common\include" "-I..\subprojects\hana\include" "-I..\subprojects\mqtt_cpp\include" "-I..\subprojects\tomlplusplus\include" "-I..\subprojects\pybind11\include" "-I..\subprojects\spdlog\include" "-IC:/msys64/mingw64/include" "-IC:/msys64/mingw64/include/python3.8" 
"-fdiagnostics-color=always" "-pipe" 
"-D_FILE_OFFSET_BITS=64" "-std=c++17" "-g" "-Wa,-mbig-obj" 
"-DBOOST_ALL_NO_LIB" "-pthread" "-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT" 
"-fpch-preprocess" "-include" "mqtt_pch.hpp" 
-MD -MQ alosaclient.exe.p/src_session.cpp.obj -MF "alosaclient.exe.p\src_session.cpp.obj.d" -o alosaclient.exe.p/src_session.cpp.obj "-c" ../src/session.cpp
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/as.exe: alosaclient.exe.p/src_session.cpp.obj: section .pdata$_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_St8functionIFbhhEEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE5beginEv: string table overflow at offset 10000080
{standard input}: Assembler messages:
{standard input}: Fatal error: can't close alosaclient.exe.p/src_session.cpp.obj: file too big
ninja: build stopped: subcommand failed.

【问题讨论】:

  • > 有效的解决方法是在等效的 archlinux docker 容器上编译和调试我的项目吗?我想这是特定于平台的问题。所以在archlinux上调试程序将是一个解决方案。我在我的 Arch linux(不是 docker)上调试 mqtt_cpp 没有任何问题。 > 我会在 Linux 上遇到同样的问题吗?我不这么认为。

标签: c++ windows mingw-w64


【解决方案1】:

如果在Fatal error: can't close xxx.obj: file too big 之后出现错误,那么汇编程序指令-Wa,-mbig-obj 将不起作用。 mingw-w64 编译器可以生成的目标文件大小似乎存在限制。

使用原生 GCC 构建时不会出现此问题,因此这里的解决方案是在 docker 容器上调试大型可执行文件。使用Visual Studio Code,调试配置launch.json需要设置如下:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C++ debug",
      "type": "cppdbg",
      "request": "launch",
      "stopAtEntry": false,
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "windows":{
        "program": "/usr/project/build/session",
        "cwd": "/usr/project",
        "args": ["/usr/project/test/config/linkcommand.toml", "ABCDE"],
        "pipeTransport": {
          "pipeCwd": "${workspaceRoot}",
          "pipeProgram": "docker",
          "pipeArgs": [
              "run", 
              "-i", 
              "-v",
              "c:/projtms/alosa1-client:/usr/project",
              "${config:MECOS_windows_mingw_toolchain}", 
              "sh",
              "-c"
          ],
          "debuggerPath": "/usr/bin/gdb"
        },
        "sourceFileMap": {
                "/usr/project":"C:\\ProjTMS\\alosa1-client"
        },
      },
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}

请记住我的项目具有以下结构:

c:/projtms/alosa1-client
├── src
|   └── session.cpp
├── include
|   ├── scope.hpp
│   └── session.hpp
├── subprojects
│   ├── somesubproject
│   └── anothersubproject
└── meson.build

请注意,工作区 c:/projtms/alosa1-client 挂载在 docker 容器 /usr/project 文件夹中,因此需要相应地指定 sourceFileMap 选项。

此设置允许调试可执行文件,而对目标文件大小没有任何限制。

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 2020-09-16
    • 2013-08-27
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多