该程序由带有 -g 标志、-static-libgcc 和 -static-libstdc++ 的 g++ 编译。没有包括优化标志。但是由于某种原因,我无法进入主程序。为什么?
$ nm -C test.exe | grep 主要 006c05b0 T __getmainargs 006b0ad0 T __main 0088d0e8 B __mingw_winmain_hInstance 0088d0e4 B __mingw_winmain_lpCmdLine 0088d0ec B __mingw_winmain_nShowCmd 006ce518 D __native_dllmain_reason 00401180 t __tmainCRTStartup 0088edc8我_imp____getmainargs 007491c0 r jisx0213_to_ucs_main 00405f0c T 主 00401570 T mainCRTStartup 00884010 b 主网 004a3371 T sqlite3_backup_remaining 0078ada0 r uhc_1_2charset_main 0078c440 r uhc_1_2uni_main_page81 007899a0 r uhc_2_2charset_main 0078db00 r uhc_2_2uni_main_pagea1 $ gdb test.exe GNU gdb (pcx32) 7.3.50.20111127-cvs 版权所有 (C) 2011 Free Software Foundation, Inc. 许可 GPLv3+:GNU GPL 版本 3 或更高版本 这是免费软件:您可以自由更改和重新分发它。 在法律允许的范围内,不提供任何保证。输入“显示复制” 和“显示保修”了解详情。 此 GDB 配置为“i686-w64-mingw32”。 有关错误报告说明,请参阅: ... 从 c:\test.exe 读取符号 ...完毕。 (gdb) 中断主要 0x405f15 处的断点 1:文件 test.cpp,第 1054 行。 (gdb) 中断 mainCRTStartup 0x401570 处的断点 2 (gdb) 中断 __tmainCRTStartup 0x40118c 处的断点 3 (gdb) 中断 __main 0x6b0ad0 处的断点 4 (gdb) 中断 __getmainargs 0x6c05b0 处的断点 5 (gdb) 运行 启动程序:c:\test.exe [新线程 5832.0xc0c] 在启动过程中,程序以代码 0xc0000022 退出。 (gdb)
PS dependency walker 显示它无法打开 SYSNTFY.DLL 并且找不到 IEFRAME.DLL。然而,这并不新鲜,也不应该成为问题。
(gdb) 信息文件 来自“c:\test.exe”的符号。 本地执行文件: `c:\test.exe', 文件类型为 pei-i386。 入口点:0x401570 0x00401000 - 0x006c14c4 是 .text 0x006c2000 - 0x006ce5d0 是 .data 0x006cf000 - 0x0080c3e0 是 .rdata 0x0080d000 - 0x00883c58 是 .eh_frame 0x00884000 - 0x0088d178 是 .bss 0x0088e000 - 0x00891d40 是 .idata 0x00892000 - 0x00892038 是 .CRT 0x00893000 - 0x00893020 是 .tls (gdb) 中断 *0x401570 注意:断点 2 也设置在 pc 0x401570。 0x401570 处的断点 6 (gdb) 运行 启动程序:c:\test.exe [新线程 5332.0x28b0] 在启动过程中,程序以代码 0xc0000022 退出。
这说明入口点确实是__tmainCRTStartup
,但 gdb 似乎没有到达那里。
答案就像评论一样:图书馆把一切都搞砸了。为了弄清楚这一点,我一个一个地取消了每个库的链接,直到它设法进入主库。