Eclipse gdb不会调试Cygwin可执行文件

时间:2014-10-16 15:21:47

标签: debugging gdb eclipse-cdt

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

我可以在命令行中使用gdb,没有问题。

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

我最初的问题是使用TI的Code Composer Studio(基于Eclipse Kepler)来尝试调试使用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-on-fork on

291,000 3 ^完成

291,000(gdb)

291,000 4-enable-pretty-printing

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 language

291,052 15 ^完成,值="自动"

291,052(gdb)

291,052 16-gdb-set --thread-group i1 language c

291,053 16 ^完成

291,053(gdb)

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

291,054 17 ^完成,值=" 8"

291,054(gdb)

291,054 18-gdb-set --thread-group i1 language auto

291,055 18 ^完成

291,055(gdb)

291,055 19-interpreter-exec --thread-group i1 console" show endian"

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

291,056 19 ^完成

291,056(gdb)

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

291,058 20 ^完成,bkpt = {数=" 1",类型="断点",DISP ="删除",启用=" Y",ADDR =&#34 ; 0x00000001004010dd" \ FUNC ="主",文件="的hello.c",全名=" /cygdrive/c/IntelligentD/scratch/hello.c",线=&# 34; 5",线程组\ S = [" I1&#34],次=" 0",原始位置="主"}

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 =线程创建,id =" 1",group-id =" i1"

291,077~" [新主题10376.0x22c8] \ n"

291,077 21 ^正在运行

291,077 *正在运行,thread-id ="所有"

291,077(gdb)

291,080 =线程退出,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-exit

291,090 23 ^退出

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

(GDB) 21-exec-run --thread-group i1 =线程组开始,ID =" I1",PID =" 7244" =线程创建,ID =" 1",组ID =" I1" 〜" [新主题7244.0xca4] \ n" 21 ^运行 *运行,线程ID ="所有" (GDB) =库加载的,ID =" /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll",目标名称=" /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll" ,主机名=" /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll",符号加载=" 0",线程组=" I1" =库加载的,ID =" /cygdrive/c/WINDOWS/system32/kernel32.dll",目标名称=" /cygdrive/c/WINDOWS/system32/kernel32.dll" ,主机名=" /cygdrive/c/WINDOWS/system32/kernel32.dll",符号加载=" 0",线程组=" I1" =库加载的,ID =" /cygdrive/c/WINDOWS/system32/KERNELBASE.dll",目标名称=" /cygdrive/c/WINDOWS/system32/KERNELBASE.dll" ,主机名=" /cygdrive/c/WINDOWS/system32/KERNELBASE.dll",符号加载=" 0",线程组=" I1" =库加载的,ID =" /cygdrive/c/WINDOWS/System32/SYSFER.DLL",目标名称=" /cygdrive/c/WINDOWS/System32/SYSFER.DLL" ,主机名=" /cygdrive/c/WINDOWS/System32/SYSFER.DLL",符号加载=" 0",线程组=" I1" =库加载的,ID =" /usr/bin/cygwin1.dll",目标名称=" /usr/bin/cygwin1.dll",主机名=#34& ; /usr/bin/cygwin1.dll",符号加载=" 0",线程组=" I1" =库加载的,ID =" /cygdrive/c/WINDOWS/system32/psapi.dll",目标名称=" /cygdrive/c/WINDOWS/system32/psapi.dll" ,主机名=" /cygdrive/c/WINDOWS/system32/psapi.dll",符号加载=" 0",线程组=" I1" =线程创建,ID =" 2",组ID =" I1" 〜" [新主题7244.0x1ba8] \ n" *运行,线程ID ="所有" =断点改性,BKPT = {数=" 1",类型="断点",DISP ="删除",启用=" Y&#34 ;,ADDR =" 0x00000001004010dd",FUNC ="主",文件="的hello.c",全名=" / cygdrive / C /刮伤/的hello.c",线=" 5",线程组= [" I1&#34],次=" 1",原始位置=&# 34;主"} 〜" \ n临时断点" 〜" 1,hello.c的main():5 \ n" 〜" 5 \ t printf(\" Hello world \ n \"); \ n" *停止,原因="断点命中",DISP ="删除",bkptno =" 1",帧= {ADDR =" 0x00000001004010dd&#34 ;,FUNC ="主",ARGS = [],FILE ="的hello.c",全名=" /cygdrive/c/scratch/hello.c"行=" 5"},螺纹-ID =" 1",停止线程="所有" =断点缺失,ID =" 1"

(GDB)

这是否意味着Eclipse Kepler如何与gdb交互?我不知道这意味着什么,或者从哪里开始。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,因为我通过大量的试验和错误来解决这个问题,并且它不涉及与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。