VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.1.4,仅支持vs2013。此插件可以在CSDN下载频道下载(http://download.csdn.net/detail/lights_joy/8429771),安装过程参见《用vs2013+velt-0.1.4进行嵌入式开发:插件安装》。下面是它的基本功能:
- 支持x86 Linux,海思hi3516/hi3520,MinGW这几个平台,提供这几个平台的项目模板。
- 完成UBOOT的编译,并根据编译的错误信息自动定位到相应的文件位置。
- 完成LINUX内核的编译,并根据编译的错误信息自动定位到相应的文件位置。
- 在VS下完成Linux内核的配置。
- 不使用Makefile进行Linux应用程序的编译。
- 使用Makefile进行Linux应用程序的开发。
- 使用SSH连接目标机器并用gdb进行应用程序的调试。
- 使用Telnet连接目标机器并用gdb进行应用程序的调试。
- 在VS中集成Linux终端(Poderosa),支持SSH/Telnet/Com,在打开终端时自动将VS的变量导出为bash里的变量,如ProjectDir等。
本文讨论在调用Mingw gdb时如何中断其执行过程。
当Mingw GDB加载程序并运行时,需要接收Ctrl-C中断程序的运行并进入调试状态。在先前的方案中,直接用GenerateConsoleCtrlEvent发送此事件就可以了。但在调试方案修改后这种方式是失败的,其原因在于GenerateConsoleCtrlEvent需要满足的条件之一是调用者必须拥有Console,但在修改后的方案中,直接在调试引擎下调用gdb,而调试引擎是没有Console的!
查了一下资料,似乎需要使用RemoteThread,但此法过于复杂了。
实际上,根据GenerateConsoleCtrlEvent失败的原因很容易可以想到,只要想办法在调用此函数前让它认为调用者拥有Console就可以了:
//import in the declaration for GenerateConsoleCtrlEvent [DllImport("kernel32.dll", SetLastError = true)] static extern bool GenerateConsoleCtrlEvent(ConsoleCtrlEvent sigevent, int dwProcessGroupId); public enum ConsoleCtrlEvent { CTRL_C = 0, CTRL_BREAK = 1, CTRL_CLOSE = 2, CTRL_LOGOFF = 5, CTRL_SHUTDOWN = 6 } [DllImport("kernel32.dll", SetLastError = true)] static extern bool AttachConsole(uint dwProcessGroupId); [DllImport("kernel32.dll", SetLastError = true)] static extern bool FreeConsole(); /// <summary> /// 发送Ctrl-C /// </summary> override public void Break() { if (!AttachConsole((uint)_process.Id)) return; if (!GenerateConsoleCtrlEvent(ConsoleCtrlEvent.CTRL_C, _process.Id)) return; if (!FreeConsole()) return; }
这里的_process就是在引擎中创建的cmd.exe进程。
先用AttatchConsole连接,再调用GenerateConsoleCtrlEvent发送Ctrl-C就没有问题了。
最后记得FreeConsole!
??