【问题标题】:Eclipse gdb won't debug Cygwin executableEclipse gdb 不会调试 Cygwin 可执行文件
【发布时间】:2014-12-12 00:54:27
【问题描述】:

我在我的 Windows 7 PC 上使用 Cygwin 创建了一个简单的 Hello world 可执行文件,使用以下命令构建它:gcc hello.c -g

我可以在可执行文件的命令行中毫无问题地使用 gdb。

然后在 Eclipse Kepler 中,我使用以下设置创建了一个调试配置: - C/C++ 应用程序具有可执行文件的完整路径 - 未连接到项目;项目框为空白。工作区中没有任何项目。 - 选择“禁用自动构建” - 选择“在启动时停止:main” - GDB 调试器设置为 C:\cygwin64\bin\gdb.exe - 我将完整路径添加到包含 hello.c 的目录和可执行文件到“源查找路径”

我最初的问题是使用 TI 的基于 Eclipse Kepler 的 Code Composer Studio 来尝试调试使用 shell 中的手写 makefile 创建的单元测试可执行文件。下载 Eclipse Kepler 并使用一个简单的 hello world 程序可以将问题简化为基础。我在使用 CCS 或常规 Eclipse 时遇到了同样的问题。

问题是,当我尝试运行此调试配置时,gdb 跟踪控制台显示如下:

290,997 2-gdb-set 断点挂起

290,999 2^完成

290,999 (gdb)

290,999 3-gdb-set detach-on-fork on

291,000 3^完成

291,000 (gdb)

291,000 4-启用漂亮打印

291,001 4^完成

291,001 (gdb)

291,001 5-gdb-set python print-stack none

291,002 5^完成

291,002 (gdb)

291,002 6-gdb-set 打印对象打开

291,003 6^完成

291,003 (gdb)

291,003 7-gdb-set 打印七位字符串

291,004 7^完成

291,004 (gdb)

291,004 8-gdb-set host-charset UTF-8

291,005 8^完成

291,005 (gdb)

291,005 9-gdb-set target-charset WINDOWS-1252

291,006 9^完成

291,006 (gdb)

291,006 10-gdb-set target-wide-charset UTF-16

291,007 10^完成

291,007 (gdb)

291,007 11source .gdbinit

291,008 &"source .gdbinit\n"

291,008 &".gdbinit: 没有这样的文件或目录。\n"

291,008 11^error,msg=".gdbinit: 没有这样的文件或目录。"

291,009 (gdb)

291,009 12-gdb-set target-async off

291,010 12^完成

291,010 (gdb)

291,010 13-gdb-set auto-solib-add on

291,011 13^完成

291,011 (gdb)

291,016 14-file-exec-and-symbols --thread-group i1 C:/IntelligentD/scratch/a.exe

291,051 14^完成

291,051 (gdb)

291,051 15-gdb-show --thread-group i1 语言

291,052 15^done,value="auto"

291,052 (gdb)

291,052 16-gdb-set --thread-group i1 语言 c

291,053 16^完成

291,053 (gdb)

291,053 17-data-evaluate-expression --thread-group i1 "sizeof (void*)"

291,054 17^done,value="8"

291,054 (gdb)

291,054 18-gdb-set --thread-group i1 语言自动

291,055 18^完成

291,055 (gdb)

291,055 19-interpreter-exec --thread-group i1 控制台“显示字节序”

291,056 ~"目标字节序是自动设置的(目前是小字节序)\n"

291,056 19^完成

291,056 (gdb)

291,057 20-break-insert --thread-group i1 -t -f main

291,058 20^完成,bkpt= {number="1",type="breakpoint",disp="del",enabled="y",addr="0x00000001004010dd",\ func="main",file="hello.c",fullname="/cygdrive/c/IntelligentD/scratch/hello.c",line="5",thread-group\ s=["i1"],times="0",original-location="main"}

291,059 (gdb)

291,060 21-exec-run --thread-group i1

291,075 =thread-group-started,id="i1",pid="10376"

291,077 22-list-thread-groups --available

291,077 =thread-created,id="1",group-id="i1"

291,077 ~"[新线程 10376.0x22c8]\n"

291,077 21^运行

291,077 *running,thread-id="all"

291,077 (gdb)

291,080 =thread-exited,id="1",group-id="i1"

291,080 =thread-group-exited,id="i1"

291,080 21^error,msg="启动时程序退出,代码为 0xc0000135。"

291,080 (gdb)

291,080 22^error,msg="现在无法获取数据。"

291,080 (gdb)

291,088 23-gdb-退出

291,090 23^退出

根据我阅读的一些建议,我在命令行启动 gdb: gdb --interpreter=mi a.exe 并输入了日志中显示的相同命令。当我到达命令 21 时,我得到不同的输出:

(gdb) 21-执行-运行--线程组 i1 =thread-group-started,id="i1",pid="7244" =thread-created,id="1",group-id="i1" ~"[新线程 7244.0xca4]\n" 21^运行 *运行,线程ID =“全部” (gdb) =library-loaded,id="/cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll",target-name="/cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll",host-name="/cygdrive/c /WINDOWS/SYSTEM32/ntdll.dll",symbols-loaded="0",thread-group="i1" =library-loaded,id="/cygdrive/c/WINDOWS/system32/kernel32.dll",target-name="/cygdrive/c/WINDOWS/system32/kernel32.dll",host-name="/cygdrive/c /WINDOWS/system32/kernel32.dll",symbols-loaded="0",thread-group="i1" =library-loaded,id="/cygdrive/c/WINDOWS/system32/KERNELBASE.dll",target-name="/cygdrive/c/WINDOWS/system32/KERNELBASE.dll",host-name="/cygdrive/c /WINDOWS/system32/KERNELBASE.dll",symbols-loaded="0",thread-group="i1" =library-loaded,id="/cygdrive/c/WINDOWS/System32/SYSFER.DLL",target-name="/cygdrive/c/WINDOWS/System32/SYSFER.DLL",host-name="/cygdrive/c /WINDOWS/System32/SYSFER.DLL",symbols-loaded="0",thread-group="i1" =library-loaded,id="/usr/bin/cygwin1.dll",target-name="/usr/bin/cygwin1.dll",host-name="/usr/bin/cygwin1.dll",symbols-加载=“0”,线程组=“i1” =library-loaded,id="/cygdrive/c/WINDOWS/system32/psapi.dll",target-name="/cygdrive/c/WINDOWS/system32/psapi.dll",host-name="/cygdrive/c /WINDOWS/system32/psapi.dll",symbols-loaded="0",thread-group="i1" =thread-created,id="2",group-id="i1" ~"[新线程 7244.0x1ba8]\n" *运行,线程ID =“全部” =breakpoint-modified,bkpt={number="1",type="breakpoint",disp="del",enabled="y",addr="0x00000001004010dd",func="main",file="hello.c ",fullname="/cygdrive/c/scratch/hello.c",line="5",thread-groups=["i1"],times="1",original-location="main"} ~"\n临时断点" ~"1, main () at hello.c:5\n" ~"5\t printf(\"Hello world\n\");\n" *stopped,reason="breakpoint-hit",disp="del",bkptno="1",frame={addr="0x00000001004010dd",func="main",args=[],file="hello.c" ,fullname="/cygdrive/c/scratch/hello.c",line="5"},thread-id="1",stopped-threads="all" =breakpoint-deleted,id="1"

(gdb)

这是否意味着 Eclipse Kepler 与 gdb 交互的方式存在错误?我不知道这意味着什么,也不知道从这里去哪里。

【问题讨论】:

    标签: debugging gdb eclipse-cdt


    【解决方案1】:

    回答我自己的问题,因为我通过反复试验弄明白了这个问题,而且它不涉及使用 gdb-mi。

    简而言之,我发现无法让 Eclipse 调试与现有项目无关的可执行文件。我必须使用这个新项目的主目录创建一个类型为“Makefile project with existing code”的新项目,该目录还没有 .project 和 .cproject 文件,在我的情况下是我的原始交叉编译项目的子目录,即CCS 项目。然后,在新的 Eclipse 项目的调试配置中,将其指向找到源代码的位置。

    最终我在 Code Composer Studio 中得到了这个工作。完整的解释是我在这个线程中发表的最后一篇文章:http://e2e.ti.com/support/development_tools/code_composer_studio/f/81/p/375037/1323811.aspx#1323811 我没有在这个答案中包含完整的解释,因为我的问题 here 是关于常规 Eclipse,而答案是关于 CCS IDE。

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 2018-01-31
      • 2021-02-14
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多