VELT-0.1.5开发:中断MinGW gdb的执行

VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studioIDE中进行Linux应用程序的开发(包括编译和调试),也可以进行ubootlinux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.1.4,仅支持vs2013。此插件可以在CSDN下载频道下载(http://download.csdn.net/detail/lights_joy/8429771),安装过程参见《vs2013+velt-0.1.4进行嵌入式开发:插件安装》。下面是它的基本功能:

  1. 支持x86 Linux,海思hi3516/hi3520MinGW这几个平台,提供这几个平台的项目模板。

  2. 完成UBOOT的编译,并根据编译的错误信息自动定位到相应的文件位置。

  3. 完成LINUX内核的编译,并根据编译的错误信息自动定位到相应的文件位置。

  4. VS下完成Linux内核的配置。

  5. 不使用Makefile进行Linux应用程序的编译。

  6. 使用Makefile进行Linux应用程序的开发。

  7. 使用SSH连接目标机器并用gdb进行应用程序的调试。

  8. 使用Telnet连接目标机器并用gdb进行应用程序的调试。

  9. 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


 








??

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。