为什么我的程序还没启动就崩溃了?

Why is my program crashing before it starts?

本文关键字:崩溃 启动 我的 程序 为什么      更新时间:2023-10-16

程序由g++使用-g标志、-static-libgcc和-static-libstdc++编译。没有包含优化标志。由于某些原因,我无法进入main。为什么?

<>之前$ nm -C test.exe | grep main[00:60 . 05] [au:006b0ad0 T __main0088d0e8 B __mingw_winmain_hInstance0088d0e4 B __mingw_winmain_lpCmdLine0088d0ec B __mingw_winmain_nShowCmd . c006ce518 D __native_dllmain_reason00401180 t __tmainCRTStartup0088edc8 I _imp____getmainargs007491c0 r jisx0213_to_ucs_main00405f0c T主接线00401570 T mainCRTStartup00884010 b维护004a3371 T sqlite3_backup_remaining0078ada0 r uhc_1_2charset_main0078c440 r uhc_1_2uni_main_page81007899a0 r uhc_2_2charset_main0078db00 r uhc_2_2uni_main_pagea1$ GDB test.exeGNU gdb (pcx32) 7.3.50.20111127-cvs版权所有2011自由软件基金会,Inc。License GPLv3+: GNU GPL版本3及以上这是自由软件:您可以自由地修改和重新发布它。在法律允许的范围内,不提供任何保证。输入"显示复制"还有"出示保修单"。这个GDB配置为"i686-w64-mingw32"。有关bug报告说明,请参见:...从c:test.exe读取符号……。(gdb)断开主断点1在0x405f15:文件test.cpp,第1054行。中断mainCRTStartup断点2在0x401570(gdb) break __tmainCRTStartup断点3在0x40118c(gdb)打破__main断点4在0x6b0ad0(gdb) break __getmainargs断点5在0x6c05b0(gdb)运行启动程序:c:test.exe[新线程5832.0xc0c]启动过程中程序退出,代码为0xc0000022。(gdb)之前

注:依赖项执行器显示它无法打开SYSNTFY.DLL,也无法找到IEFRAME.DLL。然而,这并不新鲜,也不应该是问题所在。

<>之前(gdb) info文件来自"c:test.exe"的符号。本地执行文件:"c: test.exe",文件类型为pei-i386。入口点:0x4015700x00401000 - 0x006c14c4是.text0x006c2000 - 0x006ce5d0是。data0x006cf000 - 0x0080c3e0是.rdata0x0080d000 - 0x00883c58是。eh_frame0x00884000 - 0x0088d178是。bss0x0088e000 ~ 0x00891d40为。data0x00892000 - 0x00892038是。crt0x00893000 - 0x00893020是。tls(gdb) break *0x401570注意:断点2也设置在pc 0x401570。断点6在0x401570(gdb)运行启动程序:c:test.exe[新线程5332.0x28b0]启动过程中程序退出,代码为0xc0000022。之前

这说明入口点确实是__tmainCRTStartup,但是gdb似乎没有到达那里。

答案就像注释:一个库把一切都搞砸了。为了解决这个问题,我一个接一个地解开了每个库的链接,直到它能够到达main。

我会怀疑你有一个静态或全局变量初始化抛出SIGSEGV或其他错误…所有静态变量和全局变量都在main函数执行之前初始化。

也……我看到你正在运行MinGW——你是否正确设置了MinGW bin目录的路径?当我构建MinGW应用程序(通过Eclipse)时,我有一个启动应用程序和两个被构建的应用程序。我必须使用启动器,除非我的Windows路径上有MinGW bin目录。

进一步阅读,值得注意的是dll是在mainCRTStartup被调用之前加载的。对于一个windows应用程序,你通常会打破_DllMain来处理这个问题。我不确定在MinGW中如何/在哪里处理?

我在使用Cygwin时遇到了同样的问题,我发现了一个糟糕的解决方案:给共享库可执行权限:

$ chmod a+x lib<name>.so.<ver>

,也,添加选项-m0755我的$(INSTALL)命令