如果我有导出符号,则GDB无效

时间:2017-03-29 12:53:00

标签: c windows gdb qemu mingw-w64

所以,我正在使用QEMU,我有一个插件系统,它使用主可执行文件中的一堆符号。 Linux中的一切工作正常,但将插件移植到Windows会造成许多不便(预计)。

起初,我努力与可执行文件链接。在Linux中,您只需要一个选项-dynamic,它不会在Windows中显示。最终,我找到了解决此问题的方法here。所以,我使用了--export-all-symbols链接选项,我将我的插件链接到使用-Wl, - out-implib生成的导入库。结果是一个工作的qemu可执行文件,同时工作的插件,除了gdb之外都按预期工作。

我正在从MinGW64 shell运行gdb,如下所示:
$ gdb --args ./qemu-system-i386w testdisk.qcow2 -monitor stdio (gdb) break tcg-plugin.c:164 Breakpoint 1 at 0x410f1c: file C:/fromgit/plugins_test/qemu-work/tcg/tcg-plugin.c, line 164. (gdb) run
但后来我得到以下错误:
Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x410f1c Command aborted.
或者它将开始工作,但不会触发任何断点,尽管它们应该定义。

我想,这可能是由于从qemu可执行文件导出所有符号引起的,所以我没有使用--export-all-symbols而是使用__declspec(dllexport)属性来限定所需的导出符号,但这并没有改变任何东西。此外,我发现,向可执行文件添加任何导出符号都会导致gdb出错,就像前面描述的那样。

应该提到的是,如果我只构建qemu,没有任何导出符号,我会得到一个可以正常工作的可执行文件,并且gdb正常工作。

所以问题是 - 我错过了什么吗?什么可能导致gdb不起作用?

0 个答案:

没有答案