我在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交互?我不知道这意味着什么,或者从哪里开始。
答案 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。