Vs2013在Linux开发中的应用(27):线程列表

快乐虾

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

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

在gdb加载应用程序并运行时,可以检测到线程的创建,我们将此消息以事件的形式通知了SDM。因此当中断发生时,对于每一个线程,VS的SDM将调用我们的回调:

        // Retrieves a list of the stack frames for this thread.
        // We currently call into the process and get the frames.  We might want to cache the frame info.
        int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 enumObject) {
            if(_debuggedThread.Id == -1)
            {
                enumObject = null;
                return VSConstants.E_FAIL;
            }

            IList<PythonStackFrame> stackFrames = new List<PythonStackFrame>();
            string info = _debuggedThread.Process.ExecCommand("-thread-select " + _debuggedThread.Id.ToString());
            int depth = GetStackInfoDepth();
            for (int i = 0; i < depth; i++ )
            {
                PythonStackFrame frm = GetStackInfo(i);
                stackFrames.Add(frm);
            }

            _debuggedThread.Frames = stackFrames;

            int numStackFrames = stackFrames.Count;
            FRAMEINFO[] frameInfoArray;

            frameInfoArray = new FRAMEINFO[numStackFrames];

            for (int i = 0; i < numStackFrames; i++) {
                AD7StackFrame frame = new AD7StackFrame(_engine, this, stackFrames[i]);
                frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]);
            }

            enumObject = new AD7FrameInfoEnum(frameInfoArray);
            return VSConstants.S_OK;
        }

在此我们填上了此线程中的栈信息,而后SDM还将针对栈的每一层调用查询更进一步的信息,如局部变量、函数参数等,按照接口的要求返回之后就可以在VS下看到线程列表的信息了:

双击可以查看线程的栈列表:

这里存在的一个问题是速度,当线程比较多的时候(44个),刷新一次居然要将近5秒,看来需要改进gdb命令调用的方式。

??

时间: 2024-08-03 08:05:13

Vs2013在Linux开发中的应用(27):线程列表的相关文章

Vs2013在Linux开发中的应用(32):文本可视化

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 VS2013提供了一个文本可视化的工具,在显示XML之类的字符串时相当方便,下面我们就让VS2013也能显示我们的字符串: 首先我们需要判断表达式的返回值类型,如果是字符串的话就设置 if (_evalResult.Flags.HasFlag(EvaluationFlags.HasRawRepr)) { propertyInfo.dwAttrib |= enum_DBG_ATTRIB_FLAGS

Vs2013在Linux开发中的应用(18): 应用程序调试方案

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在前面我们对VS的调试接口做了基本的功能验证,下面开始方案的拟定: 如上图所示,我们需要在WINDOWS端运行两个辅助程序,一个是RemoteConsole,这个程序的主要作用是显示远端程序的输出,并将用户输入传送给远端.另一个是python解释器,这个解释器用于完成SSH/TELNET/COM连接,并负责调用远端Linux上的gdb. 当启动项目调试时,VC调试引擎将加载我们的RemoteCo

Vs2013在Linux开发中的应用(34):Ctrl + F5支持

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 VS中常用的Ctrl+F5可以不调试直接运行,但是其运行的环境变量仍然可以传递给应用程序,在我们的调试方案中使用了一个叫RemoteConsole的stub程序 在调试状态下,EmbedLinux调试引擎会在开始调试时打开一个自动选择的服务端口,再将此端口号通过环境变量传递给RemoteConsole. 在直接运行的情况下,RemoteConsole将由VS自动加载,此时由于没有调试引擎,也就没

Vs2013在Linux开发中的应用(30):程序中断

在我们在gdb中加载程序并运行时,可以按CTRL-C中断执行,此时gdb输出: ^C*stopped,reason="signal-received",signal-name="SIGINT",signal-meaning="Interru pt",frame={addr="0x00110424",func="__kernel_vsyscall",args=[]},thread-id="1&quo

Vs2013在Linux开发中的应用(26):表达式计算

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 当VS调试时将鼠标移到一个变量上面的时候,VS将显示这个变量的值,实际上这个时候VS进行了表达式的计算,我们所需要做的,就是把这个过程转换为gdb的命令: Operation Description -enable-pretty-printing enable Python-based pretty-printing -var-create create a variable object -v

Vs2013在Linux开发中的应用(19): 启动gdb

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 1.1    加载调试引擎 由于我们无法干预VC的调试引擎加载,但可以侦听VC的调试引擎加载事件,在此事件处理中可以调用自己的调试引擎: publicvoid LaunchDebugTarget(string filePath, string env) { varserver = (IDebugCoreServer3)GetService(typeof(IDebugCoreServer3));

Vs2013在Linux开发中的应用(17): 调试参数传递

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在启动调试后还有一个问题,那就是调试参数的传递,当调试器启动时,我们似乎已经无法获取到IDE的项目参数,此时只能通过调试器的环境变量进行参数传递. 首先在项目参数中定义好目标机器的相关信息: 然后将这些参数通过调试器的环境变量参数传递进去: 当启动调试时,SDM将调用: intIDebugEngineLaunch2.LaunchSuspended(string pszServer, IDebug

Vs2013在Linux开发中的应用(33):反汇编

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 1.1    失败 按照文档的说法,反汇编应当实现IDebugDisassemblyStream2接口,然后在 // The debugger calls this when it needs to obtain the IDebugDisassemblyStream2 for a particular code-context. // The sample engine does not su

Vs2013在Linux开发中的应用(20): 断点设置

当vs设置断点时,SDM将调用: // Creates a pending breakpoint in the engine. A pending breakpoint is contains all the information needed to bind a breakpoint to // a location in the debuggee. int IDebugEngine2.CreatePendingBreakpoint(IDebugBreakpointRequest2 pBPR