为什么我的程序还没启动就崩溃了?
Why is my program crashing before it starts?
程序由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)命令
相关文章:
- ESP32 OTA更新在启动时不断崩溃
- 如何在启动过程中崩溃时使用 gdb 调试可执行文件
- 如何重新启动崩溃的线程
- 如何在同一程序中在Qt应用程序崩溃时自动重新启动Qt应用程序
- OpenGL 应用程序在启动时立即崩溃
- 在Cuda中启动2d线程块时崩溃
- 代码编译,但是在启动后崩溃(rot13)
- 我有一个 c++ 代码,它在启动时崩溃,然后到达问题所在 main() 的执行
- Arduino崩溃并在"random points"重新启动
- Win7 / Eclipse / OpenCV / MinGW:应用程序每次启动时都会崩溃
- QTimer 在以单独的方法启动时崩溃
- GDB 在启动时崩溃(内部错误:follow_die_offset)
- 本机C++程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃
- 新线程启动时应用程序崩溃
- 声明SDL_Rect数据成员在启动时崩溃,找不到原因
- 程序崩溃时重新启动应用程序
- QT应用程序在启动时崩溃(c++ windows)
- 不稳定的cython扩展在使用valgrind启动时不会崩溃
- 为什么当我第二次尝试启动同一个线程时,应用程序会崩溃
- 我的win32程序是否有办法告诉它启动的子进程已经崩溃(而不仅仅是退出)?