快乐虾
http://blog.csdn.net/lights_joy/
欢迎转载,但请保留作者信息
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.1.1,仅支持vs2013,是一个刚刚启动开发不久的插件。可以在CSDN下载频道下载(http://download.csdn.net/detail/lights_joy/8322193),安装过程参见《用Vs2013+VELT-0.1.0进行Linux开发:环境搭建》。下面是它的基本功能:
支持x86 Linux,hi3516,hi3520三个平台。
完成UBOOT的编译,并根据编译的错误信息自动定位到相应的文件位置。
完成LINUX内核的编译,并根据编译的错误信息自动定位到相应的文件位置。
完成LINUX内核的配置。
不使用Makefile进行Linux应用程序的编译。
使用SSH连接目标机器并用gdb进行应用程序的调试。
使用Telnet连接目标机器并用gdb进行应用程序的调试。
接下来让VELT支持MinGW,用ConsoleApplication工程进行试验。
依照老办法,将C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Platforms目录下的子目录复制一份改名为MinGW,并执行字符串替换操作,我们就可以看到MinGW平台了。
修改LinuxShareLib和ConsoleApplication的工程文件,在
<Import Condition="$(Platform)=='hi3516'" Project="$(EMBEDLINUX_ROOT)\msbuild\EmbedLinux.Msbuild.targets" />
之后添加一行:
<Import Condition="$(Platform)=='MinGW'" Project="$(EMBEDLINUX_ROOT)\msbuild\EmbedLinux.Msbuild.targets" />
出于效率的考虑,代码编译不再使用python完成,直接调用mingw下的gcc或者g++完成,仅需要配置好mingw的路径:
除此以外,务必将c:\mingw\bin添加到系统的路径列表中,否则gcc将无法正确编译。
mingw输出的错误信息类似于:
Z:\projects\test\LinuxConsoleApplication\LinuxShareLib>c:\mingw\\bin\gcc.exe -c -O0 -g3 -o ..\obj\MinGW\Debug\LinuxShareLib\main.obj main.c main.c: In function 'sum_test': main.c:9:2: error: 'x' undeclared (first use in this function) x = 5; ^ main.c:9:2: note: each undeclared identifier is reported only once for each func tion it appears in
将之转换为VS可以识别的格式:
1> main.c(9): error C2004: 'x' undeclared (first use in this function)
这样vs就可以正确定位错误发生的位置。
为了保持调试运行和非调试运行在参数配置上的一致性,仍然使用RemoteConsole这个代理程序,只是不再使用python,当然也不需要用户修改python代码。直接在RemoteConsole中调用mingw-gdb。
mingw-gdb和其它平台下的gdb其实大同小异,只是不同版本在一些小细节上略有不同,对我们的调试器代码少量修改后很快就可以进入调试状态了。
按照之前的设计,当在RemoteConsole下按Ctrl-C时将中断程序的执行,进入调试状态,但mingw-gdb和其它平台的gdb有所差异,此时它的输出是:
=thread-created,id="2",group-id="i1"
~"[New Thread 47020.0x288c]\n"
~"[Switching to Thread 47020.0x288c]\n"
*stopped
^error,msg="Quit (expect signal SIGINT when the program isresumed)"
(gdb)
此时程序并未真正中断,需要执行
-exec-continue
^running
*running,thread-id="all"
(gdb)
*stopped,reason="signal-received",signal-name="SIGINT",signal-meaning="Interrupt
",frame={addr="0x7705dbf6",func="KERNELBASE!CtrlRoutine",args=[],from="C:\\WINDO
WS\\SysWOW64\\KernelBase.dll"},thread-id="2",stopped-threads="all"
此时才是我们想要的中断。
再次执行
-exec-continue
^running
*running,thread-id="all"
(gdb)
=thread-exited,id="2",group-id="i1"
程序开始运行。
从上面这个过程可以看到,这里创建了一个新的线程来处理Ctrl-C的中断,当中断处理完成后这个线程也就完成使命了。
最后添加目标连接类型,实际上在平台确定之后,这个应该就不是必须的,但为了和其它平台一致,还是加上一个叫MinGW的连接类型。