快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息

1.1    载入调试引擎

因为我们无法干预VC的调试引擎载入。但能够侦听VC的调试引擎载入事件,在此事件处理中能够调用自己的调试引擎:

publicvoid LaunchDebugTarget(string filePath, string env)

{

varserver = (IDebugCoreServer3)GetService(typeof(IDebugCoreServer3));

vardebugger = (IVsDebugger3)GetService(typeof(IVsDebugger));

VsDebugTargetInfo3[] debugTargets = new VsDebugTargetInfo3[1];

debugTargets[0].dlo = (uint)DEBUG_LAUNCH_OPERATION.DLO_CreateProcess;

debugTargets[0].bstrExe = filePath;

debugTargets[0].bstrEnv = env;

debugTargets[0].guidLaunchDebugEngine = new Guid(lights.EmbedLinux.Debugger.Engine.EngineConstants.EngineId);

VsDebugTargetProcessInfo[] processInfo = new VsDebugTargetProcessInfo[debugTargets.Length];

try

{

debugger.LaunchDebugTargets3(1, debugTargets, processInfo);

}

catch(Exceptione)

{

Debug.WriteLine("Exception when Launch debugger: " + e.Message);

}

}

在此使用了IVsDebugger.LaunchDebugTarget3。在此调用中,SDM将依据EngineId查找此Engine所在的文件并进行引擎的创建。

1.2    LaunchSuspended

在SDM创建引擎后调用的第一个函数是LauchSuspended:

// Launches a process by means of the debug engine.

// Normally, Visual Studio launches a program using theIDebugPortEx2::LaunchSuspended method and then attaches the debugger

// to the suspended program. However, there arecircumstances in which the debug engine may need to launch a program

// (for example, if the debug engine is part of aninterpreter and the program being debugged is an interpreted language),

// in which case Visual Studio uses theIDebugEngineLaunch2::LaunchSuspended method

// The IDebugEngineLaunch2::ResumeProcess method iscalled to start the process after the process has been successfully launched ina suspended state.

intIDebugEngineLaunch2.LaunchSuspended(string pszServer, IDebugPort2 port, string exe, string args, string dir, string env, string options, enum_LAUNCH_FLAGS launchFlags, uint hStdInput, uint hStdOutput, uint hStdError, IDebugEventCallback2 ad7Callback, out IDebugProcess2 process)

在此函数中,我们能够让python通过某个连接载入虚拟机里的gdb。再将python进程的ID号返回给SDM:

AD_PROCESS_ID adProcessId = new AD_PROCESS_ID();

adProcessId.ProcessIdType = (uint)enum_AD_PROCESS_ID.AD_PROCESS_ID_SYSTEM;

adProcessId.dwProcessId= (uint)_process.Id;

EngineUtils.RequireOk(port.GetProcess(adProcessId,out process));

1.3    ResumeProcess

SDM调用的第二个关键函数是ResumeProcess:

// Resume a process launched byIDebugEngineLaunch2.LaunchSuspended

intIDebugEngineLaunch2.ResumeProcess(IDebugProcess2 process)

这个函数感觉有点歧义,似乎应该在这里让gdb里载入的应用执行起来,但实际上,在这个函数里应该做的是创建ProgramNode:

// Send a program node to the SDM. This will cause theSDM to turn around and call IDebugEngine2.Attach

// which will complete the hookup with AD7

IDebugPort2port;

EngineUtils.RequireOk(process.GetPort(outport));

IDebugDefaultPort2 defaultPort = (IDebugDefaultPort2)port;

IDebugPortNotify2 portNotify;

EngineUtils.RequireOk(defaultPort.GetPortNotify(out portNotify));

EngineUtils.RequireOk(portNotify.AddProgramNode(new AD7ProgramNode(_process.Id)));

1.4    Attach

下一个关键函数:

// Attach the debug engine to a program.

intIDebugEngine2.Attach(IDebugProgram2[] rgpPrograms, IDebugProgramNode2[] rgpProgramNodes, uint celtPrograms, IDebugEventCallback2 ad7Callback, enum_ATTACH_REASON dwReason)

在这个函数中。我们须要发送两个事件给SDM:

AD7EngineCreateEvent.Send(this);

AD7ProgramCreateEvent.Send(this);

1.5    LoadComplete

当gdb成功载入应用程序后,我们须要发送LoadComplete通知SDM:

Send(newAD7LoadCompleteEvent(), AD7LoadCompleteEvent.IID, thread);

1.6    设置断点

设置断点的工作后面单独说,在此先跳过。

1.7    Continue

在断点设置完毕后,SDM将调用Continue:

// Continue is called from the SDM when it wantsexecution to continue in the debugee

// but have stepping state remain. An example is when atracepoint is executed,

// and the debugger does not want to actually enter breakmode.

publicint Continue(IDebugThread2 pThread)

在这个函数中就能够让gdb执行run命令了。

至此,SDM成功载入gdb及要调试的应用。



Vs2013在Linux开发中的应用(19): 启动gdb的更多相关文章

  1. Vs2012在Linux开发中的应用(1):开发环境

    在Linux的开发过程中使用过多个IDE.code::blocks.eclipse.source insight.还有嵌入式厂商提供的各种IDE.如VisualDsp等,感觉总是不如vs强大好用.尽管 ...

  2. Vs2012在Linux开发中的应用(5):项目属性的定义

    VS的项目属性表实际上是由一系列的XML文件定义的,都存放在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\2052文件夹下.我们全然能够 ...

  3. 4、linux开发中常用指令

    1.cat /proc/device 可以查看各个全部字符设备和块设备,在register_chrdev中设置的名字在打印出来的信息中可以看到:2.top 可以看各个应用程序占用CPU量及PID等信息 ...

  4. Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程

    MSBUILD的编译过程实际上是依据一系列的targets文件定义的.当我们在IDE运行生成.批生成.清理命令的时候.VS会查找这些命令相应的Task并运行它,以下我们逐个分析这个过程. 当运行生成操 ...

  5. linux开发中常用的命令及技巧(连载)

    1.在内核或uboot目录下搜索相关内容/文件名时:grep "USB" * -nR find -name "*USB*" 2.查看系统中设备 cat  /pr ...

  6. 【Debug】Web开发中,Tomcat正常启动,访问欢迎页404,怎么办?

    访问页面出现404是一个会经常遇到的问题.每次开发Web项目时总要掉这个坑里几次,而且还不长记性.今天来总结一下,开发时遇到这个问题的解决思路. 1. 查看访问地址是否正确,有无拼写错误. 越是低级的 ...

  7. Linux CentOS中使用SQL*Plus启动和关闭数据库

    启动和关闭数据库的常用工具有三个 一.SQL*Plus 在SQL*Plus环境中,用户以SYSDBA身份连接到Oracle后,可以通过命令行方式启动或关闭数据库. 二.OEM(企业管理器) 利用OEM ...

  8. Windows10系统的Linux子系统中安装MySQL数据库心得

    后端开发童鞋们, 自己开发机用的是Windows系统电脑(台式机或笔记本), 而开发的程序和使用的数据库等要运行在Linux服务器上, 这种情况有木有? 提前声明: 本文并不讨论操作系统的比较, 以及 ...

  9. 用VS2013+VELT进行Linux开发

    快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 1.1.1  什么是 ...

随机推荐

  1. 关于在Qt里让程序休眠一段时间的方法总结

    出处:http://hanzhaoxin.cnblogs.com/ Qt 为何没有提供 Sleep 论坛上不时见到有人问: Qt 为什么没有提供跨平台的 sleep 函数? 使用平台相关的 Sleep ...

  2. vue 组件相互传值

    Part.1  传值几种方式 在写项目时,遇到组件传值问题,特此记录一波~~~ (1)  父传子 (2)  子传父 (2)  兄弟组件传值 Part.2  父传子 顾名思义,就是父组件传值给子组件 子 ...

  3. delphi中使用自定义资源的方法

    如果要在delphi中使用自定义资源文件*.res文件,比如一个光标,此时可以采用下列步骤: 1,创建包含相应的资源文件,这里是创建一个包含自定义光标的res文件. 2,在主窗体的pas文件中加入编译 ...

  4. zabbix auto registration

    1./etc/zabbix/zabbix_agent.conf serverActive=zabbix server ip 2.frontend configuration>actions> ...

  5. TWaver可视化编辑器的前世今生(四)电力 云计算 数据中心

    插播一则广告(长期有效) TWaver需要在武汉招JavaScript工程师若干 要求:对前端技术(JavasScript.HTML.CSS),对可视化技术(Canvas.WebGL)有浓厚的兴趣基础 ...

  6. 数组对象分类个数js

    <script type="text/javascript"> $(function(){ var aaa = [ {"task1":"z ...

  7. Ubuntu下压缩与解压各种文件的命令

    1.压缩与解压xz文件 (1)压缩 xz -z  filename (2)解压 xz -d  filename.xz 2.压缩与解压tar文件 (1)压缩 tar -cvf  filename(压缩到 ...

  8. 笔记本无法从DHCP服务器获取地址怎么解决?

    首先,开始/运行,输入 cmd,再输入ipconfig,看看你的IP地址是不是正常的,假如不是,就是获取不到IP地址.如果得到的IP是:169.254.x.x 表示客户机无法得到DHCP的响应.(如果 ...

  9. 如何用纯 CSS 创作一种有削铁如泥感觉的菜单导航特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XqYroe 可交互视频教 ...

  10. 如何用 CSS 创作一个立体滑动 toggle 交互控件

    效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/zjoOgX 可交互视频教程 此视 ...