在Cygwin Windows中使用mingw-w64编译的32位二进制文件调试

6

我想要使用gdb来调试mingw-w64编译的32位二进制文件。然而,gdb会给出很多警告,并且不显示任何堆栈跟踪。我该如何正常地调试这个过程?

以下是一些相关的细节:

  • 这个GDB被配置为“x86_64-pc-cygwin”。
  • GNU gdb(GDB)(Cygwin 7.10.1-1)7.10.1
  • 我正在编译wxWidgets库并用它构建我的程序。但这对于这个问题来说应该不相关,除了在wxWidgets的configure中使用了--host=i686-w64-mingw32 --build=i686-pc-cygwin标志之外。

ashish@DESKTOP-133N35M /cygdrive/c/Users/ashish/work/reachit

$ gdb program.exe
GNU gdb (GDB) (Cygwin 7.10.1-1) 7.10.1
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-cygwin".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from program.exe...done.
(gdb) b ReachItButton::OnChar(wxKeyEvent&)
Breakpoint 1 at 0x734672: file binReach.cpp, line 49.
(gdb) r
Starting program: /cygdrive/c/Users/ashish/work/reachit/program.exe
[New Thread 6148.0x184]
warning: `/cygdrive/c/Windows/SYSTEM32/ntdll.dll': Shared library architecture i386:x86-64 is not compatible with target architecture i386.
warning: `/cygdrive/c/Windows/System32/wow64.dll': Shared library architecture i386:x86-64 is not compatible with target architecture i386.
warning: `/cygdrive/c/Windows/System32/wow64win.dll': Shared library architecture i386:x86-64 is not compatible with target architecture i386.
warning: dll path for "WOW64_IMAGE_SECTION" can not be evaluated
warning: Could not load shared library symbols for WOW64_IMAGE_SECTION.
Do you need "set solib-search-path" or "set sysroot"?
warning: dll path for "WOW64_IMAGE_SECTION" can not be evaluated
warning: Could not load shared library symbols for WOW64_IMAGE_SECTION.
Do you need "set solib-search-path" or "set sysroot"?
warning: dll path for "NOT_AN_IMAGE" can not be evaluated
warning: Could not load shared library symbols for NOT_AN_IMAGE.
Do you need "set solib-search-path" or "set sysroot"?
warning: dll path for "NOT_AN_IMAGE" can not be evaluated
warning: Could not load shared library symbols for NOT_AN_IMAGE.
Do you need "set solib-search-path" or "set sysroot"?
warning: `/cygdrive/c/Windows/System32/wow64cpu.dll': Shared library architecture i386:x86-64 is not compatible with target architecture i386.
[New Thread 6148.0x2b4]
[New Thread 6148.0x314]
[New Thread 6148.0x103c]
12:33:26: mylog In ReachItPanel :
12:33:28: mylog In ReachItButton.. onChar
gdb: unknown target exception 0x4000001f at 0x734672

Program received signal ?, Unknown signal.
0x0009dfe8 in ?? ()
(gdb) bt
#0  0x0009dfe8 in ?? ()
#1  0x00000000 in ?? ()
(gdb) q
A debugging session is active.

        Inferior 1 [process 6148] will be killed.

Quit anyway? (y or n) y

ashish@DESKTOP-133N35M /cygdrive/c/Users/ashish/work/reachit
$

在 config.log 中,gcc/configure 被赋予了以下参数:-C --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=i686-w64-mingw32

/cygdrive/i/szsz/tmpp/cygwin64/mingw64-i686/mingw64-i686-gcc-5.4.0-4.x86_64/src/gcc-5.4.0/configure --srcdir=/cygdrive/i/szsz/tmpp/cygwin64/mingw64-i686/mi
ngw64-i686-gcc-5.4.0-4.x86_64/src/gcc-5.4.0 --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --docdir=/usr/share/doc/mingw64-i686-gcc --htmldir=/usr/
share/doc/mingw64-i686-gcc/html -C --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=i686-w64-mingw32 --without-libiconv-prefix --without-libintl-prefix --with-sysr
oot=/usr/i686-w64-mingw32/sys-root --with-build-sysroot=/usr/i686-w64-mingw32/sys-root --disable-multilib --disable-win32-registry --enable-languages=c,ada,c++,fortran,lto,
objc,obj-c++ --enable-fully-dynamic-string --enable-graphite --enable-libgomp --enable-libquadmath --enable-libquadmath-support --enable-libssp --enable-version-specific-ru
ntime-libs --with-dwarf2 --with-gnu-ld --with-gnu-as --with-tune=generic --with-cloog-include=/usr/include/cloog-isl --with-system-zlib --enable-threads=posix --libexecdir=
/usr/lib

Gdb是64位的,而二进制文件是32位的。我可以尝试使用64位的二进制文件,但我不确定为什么mingw-w64 g++编译器不能生成64位的二进制文件。

Cygwin是64位的。

我已经使用以下方法编译了二进制文件:

 i686-w64-mingw32-g++ -ggdb -O0  binReach.cpp `wx-config --cxxflags 
 --libs std` -Wall -o program -static-libgcc -static-libstdc++ -Wl,
 -Bstatic,-lstdc++,-lpthread -Wl,-Bdynamic

我认为我遇到了这个问题: https://virtuallyfun.superglobalmegacorp.com/2015/10/04/32bit-64bit-gdb-collision/ 但是我在cygwin64中找不到任何gdb32.exe。 - Ashish Negi
要生成32位目标,您应该在wxWidgets构建和程序中都使用“-m32”标志。 - Ripi2
@Ripi2 的二进制已经是32位的了,我需要它变成64位的。 - Ashish Negi
然后标志是“-m64”。 - Ripi2
@Ripi2,我想我明白了,我需要x86_64-mingw32-g++来编译64位代码,但我也会尝试你的建议。 - Ashish Negi
2个回答

0

0
你需要分别下载32位和64位的gdb。 因为根据mingw-64的待办事项列表,gcc多库版本已经完成,但是gdb多库版本仍在进行中,所以你不能使用单个gdb来调试32位和64位,也许将来可以使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接