精华内容
下载资源
问答
  • 另一个办法就是一般说的调试( debug ),在程序中设置断点( breakpoint ),程序运行到断点时暂停,且可以查看各个变量的具体值。1.介绍程序运行过程为:预处理 -> 编译和优化 -> 生成目标文...

    程序编译通过,但程序获得的结果不是预期时,我们可能会想一步步跟踪程序,看程序的变量如何变化。

    一个办法是在可能发生编错的地方之前写个 cout (之前就是这么做的),但显然比较费劲;

    另一个办法就是一般说的调试( debug ),在程序中设置断点( breakpoint ),程序运行到断点时暂停,且可以查看各个变量的具体值。

    1.介绍

    程序运行过程为:

    预处理 -> 编译和优化 -> 生成目标文件 -> 链接 -> 可执行文件

    • 预处理。不对源程序进行解析。仅做些预处理,如宏的替换、删除注释、处理预处理指令,如#include,#ifdef。
    • 编译和优化。解析源代码,查看语法语义是否有错误,有则停止程序同时报错,没有则会生成译文。
    • 生成目标文件。生成二进制代码。
    • 链接。如某个文件用了其它文件的变量或函数,则需要进行链接。
    • 可执行文件。

    下面几个图标含义,

    3c986005ce2253169c5fdbc6f09943e9.png
    • 编译(compile ,ctrl+F7)。
    • build(F7) 。即执行编译和链接操作,不会显示最终结果。
    • buildstop(ctrl+break)。停止build。
    • buildexecute(ctrl+F5)。全过程,会显示最终结果。
    • Go(F5)。执行到断点处
    • 断点(F9)。设置断点。删除一个断点可以将光标移动到断点处,按一次该键。删除所有断点,可以"编辑"——"断点"——"全部移除"

    2.使用

    下面的程序在几个地方设置了断点,用注释标记了下。在程序软件里则会显示一个红色的点

    #include <iostream>
    
    void cal(float x, float y){
        using namespace std;
    
        float z;
        z = x + y;  //断点
        
        float m;
        m = x - y;
    
        cout << "z is : " << z << endl;
        cout << "m is : " << m << endl;
    }
    
    void main(){
    
        using namespace std;
    
        float x;
        x = 3;   //断点
    
        float y;
        y = 7.8;    //断点
    
        for(int i=1; i < 4; i++){
        
        cout << "i is : " << i << endl;
        cout << "i+1 is : " << i+1 << endl;   //断点
        }
    
        cal(x,y);
    }
    

    在调试前先进行编译或build,看看有没有语法语义错误。

    然后再按F5或对应图标,进入调试模式,执行到第一个断点处 ,

    75721f45442abd6dd9da140ccdce14fd.png

    看看调试状态的窗口各处,

    29119f1968d40b7cfd59c92d47481783.png

    1,表示重新开始调试;2,表示关闭调试模式;

    3.调试时卡住,按这个。

    4,当我们在调试过程改变源代码时,该图表会变亮,表示是否应用改变,再重新调试。

    5,快速定位到程序调试到的地方。

    6,step into(F11):执行到某个断点处,此时不希望直接执行到下一个断点,而是希望按照代码一步步执行,点击该图标。

    如果遇到函数调用,会跟进去函数内部 如果这个函数是系统函数,会变成汇编指令,按下工具栏的Disassembly(16,没标这个数字,从12往后数) 就变成普通代码了 或者弹出一个查找资源的对话框,取消,按step out就回到普通界面了

    7,step over(F10):越过去,遇到函数会跨过去,函数里有断点 则不会越过去

    8, step out (shift+F11):跳出当前所在函数,函数里有断点不会跳过

    9,Run to cursor(ctrl+F10) :运行到光标处,中间有断点不会跳过

    断点处一定会停下

    10,向监视变量窗口添加监视变量

    11,打开或关闭监视变量的窗口(下图右边)

    12,打开或关闭变量窗口(下图左边)

    97db234c5e862e69f27c8c43ad2add37.png

    变量窗口,会显示当前环境的已经声明的变量及其值,如这里显示 “上下文” 后面的main( )函数的变量x,y。当运行进入函数中,如cal( ) ,“上下文”会变为 cal( ),同时变量也变为cal( ) 中定义的变量。

    auto指当前环境已经定义的变量;locals表示只在当前环境作用的变量,出了该作用域变量会被删除;this;

    监视变量窗口,一开始是空的,需要自己添加监视变量。“上下文”处于main( )时,而添加cal( )的变量时,会显示为找到该变量,不用担心,当运行到cal( )时,就会显示。

    监视变量窗口,可以监视调试过程中监视变量的变化。

    14,memory,输入变量的地址,可以直接查看内存 。

    展开全文
  • Rviz虚拟调试工具#include "moveit_visual_tools/moveit_visual_tools.h"...//绘制移动轨迹string frame = group.getPlanningFrame();moveit_visual_tools::MoveItVisualTools tools(frame);tools.deleteAllMarkers...

    Rviz虚拟调试工具

    #include "moveit_visual_tools/moveit_visual_tools.h"

    ...

    //绘制移动轨迹

    string frame = group.getPlanningFrame();

    moveit_visual_tools::MoveItVisualTools tools(frame);

    tools.deleteAllMarkers();

    //添加label

    tools.publishAxisLabeled(pose, "target");

    tools.trigger();

    #include "moveit_visual_tools/moveit_visual_tools.h"

    ...

    //绘制移动轨迹

    string frame = group.getPlanningFrame();

    moveit_visual_tools::MoveItVisualTools tools(frame);

    tools.deleteAllMarkers();

    //添加label

    const moveit::core::JointModelGroup *jointModelGroup = group.getCurrentState()->getJointModelGroup(groupName);

    tools.publishTrajectoryLine(plan.trajectory_, jointModelGroup);

    tools.trigger();

    可视化工具,目前只支持c++

    Gui断点调试

    // group库

    #include "moveit/move_group_interface/move_group_interface.h"

    // 可视化工具库

    #include "moveit_visual_tools/moveit_visual_tools.h"

    ......

    string groupName="manipulator";

    moveit::planning_interface::PlanningSceneInterface scene;

    moveit_visual_tools::MoveItVisualTools tools(group.getPlanningFrame());

    tools.loadRemoteControl();

    ROS_INFO_STREAM("1");

    tools.prompt("Press 'next' to start demo");

    ROS_INFO_STREAM("2");

    tools.prompt("Press 'next' to start demo");

    ROS_INFO_STREAM("3");

    tools.prompt("Press 'next' to start demo");

    ROS_INFO_STREAM("4");

    tools.prompt("Press 'next' to start demo");

    开启调试面板

    完整代码示例:

    #include #include //moveit环境引入

    #include #include #include #include "moveit_visual_tools/moveit_visual_tools.h"

    using namespace std;

    double deg2rad(double deg) {

    return deg * M_PI / 180.0;

    }

    void moveHome() {

    moveit::planning_interface::MoveGroupInterface group("manipulator_i5");

    group.setNamedTarget("home");

    group.move();

    }

    void moveZero() {

    moveit::planning_interface::MoveGroupInterface group("manipulator_i5");

    group.setNamedTarget("zero");

    group.move();

    }

    void movePose() {

    moveit::planning_interface::MoveGroupInterface group("manipulator_i5");

    //设置目标

    // group.setNamedTarget("home");

    //去到具体的位置

    geometry_msgs::Pose pose;

    // 位置

    pose.position.x = 0.364878;

    pose.position.y = -0.279625;

    pose.position.z = 0.388561 + 0.502;

    // 姿态(四元素)(欧拉角转四元素)

    tf::Quaternion quat;

    quat.setRPY(deg2rad(-166.969955), deg2rad(2.913350), deg2rad(38.519089));

    pose.orientation.x = quat.x();

    pose.orientation.y = quat.y();

    pose.orientation.z = quat.z();

    pose.orientation.w = quat.w();

    group.setPoseTarget(pose);

    //移动

    const moveit::planning_interface::MoveItErrorCode &code = group.move();

    if (code == moveit::planning_interface::MoveItErrorCode::SUCCESS) {

    // 成功

    ROS_INFO_STREAM("执行成功: Success");

    } else {

    // 失败

    ROS_INFO_STREAM("执行失败: Failed");

    }

    }

    int main(int argc, char **argv) {

    // 初始化节点

    string nodeName = "ur3_move_node";

    ros::init(argc, argv, nodeName);

    ros::NodeHandle node;

    ros::AsyncSpinner spinner(1);

    spinner.start();

    moveit::planning_interface::MoveGroupInterface group("manipulator_i5");

    moveit_visual_tools::MoveItVisualTools tools(group.getPlanningFrame());

    tools.prompt("start move home");

    moveHome();

    tools.prompt("start move zero");

    moveZero();

    tools.prompt("start move pose");

    movePose();

    //阻塞

    ros::waitForShutdown();

    return 0;

    }

    展开全文
  • ROS节点的调试一直非常麻烦,在此之前尝试过gdb、CLion、Qt插件,用起来都不太顺手,直到发现了VSCode的调试功能调试的好处有:bug导致的core dumped、segmentation fault等会停到相应的位置,方便查找想到什么,...

    0. 写在最前面

    本文档介绍了如何用VSCode的Debug功能来调试ROS的CPP节点。ROS节点的调试一直非常麻烦,在此之前尝试过gdb、CLion、Qt插件,用起来都不太顺手,直到发现了VSCode的调试功能

    调试的好处有:

    bug导致的core dumped、segmentation fault等会停到相应的位置,方便查找

    想到什么,断点停那里就可以看到变量状态,不用增加输出代码再编译这么麻烦

    条件中断,这个也不用再增加if判断再重新编译

    如果觉得写得还不错,可以找我其他文章来看看哦~~~可以的话帮我github点个赞呗。

    你的Star是作者坚持下去的最大动力哦~~~

    1. 推荐几个VSCode插件

    C/C++插件:这个是微软官方的CPP插件,装了后就可以愉快地编写、编译C++代码了。

    C++ Intellisense:这个插件能够很好地辅助C++开发者进行开发,提供包括代码跳转,自动完成,智能提示等功能。

    ROS (deprecated):这个插件作者已经停止更新了,现在主要用来启动roscore~~~

    2. debug原理及配置

    2.1 debug原理

    VSCode中是以workspace的概念处理文件关联的,每个workspace文件夹下会有一个.vscode文件夹,该文件夹下放置的是关于该workspace的路径配置、任务配置、运行配置等文件,我们正是通过编辑这些配置文件实现对工程的管理。

    微软提供的C/C++插件集成了gdb调试功能,并提供变量界面显示以及断点、监视以及调用堆栈等功能。你只需要在.vscode文件夹中配置好launch.json,就可以按下F5快捷键启动相应调试。

    由于目前并没有集成的ROS调试器,所以只能将每一个node当成一个CPP程序来进行调试。

    2.2 编译配置

    在VSCode中需要在.vscode文件夹中配置好tasks.json文件(没有的话可自己新建一个)后,就可以按Ctrl + Shift + B快捷键(这个快捷键需要将task归到build的group里才行,普通的task要Ctrl + Shift + P选Run Task),并选择相关的任务进行编译等操作。

    下面展示的配置文件主要配置了prerun、catkin build、catkin clean以及ccb四个任务。下面简介一些用到的变量,详情请看VSCode的tasks页面。将鼠标停留在相关变量上也可以看到。

    label

    就是一个名字,你按下快捷键的时候用以区分不同task

    type

    任务的类型,可设置成shell和process。前者将任务当成命令,启动终端运行,后者直接运行。

    command

    实际运行的命令

    args

    运行的参数,这里需要注意的是,如果需要进行调试,需要设置为Debug模式,并且要检查相应package中的CMakeLists.txt中有没有设置成Release模式,CMake中txt的设置优先级是最高的。比如我们的驱动就设置Release,所以即使你在这里怎么设置都没用的。

    group

    这个是分组的,貌似可以从命令行来运行分组的任务,暂时没用到

    presentation

    关于输出显示的设置,这里设置为总是输出到集成的终端,可通过"panel": "new"设置每次都启动新的终端

    problemMatcher

    错误分析器,可以分析到输出的信息中有哪些错误并显示

    dependsOn

    运行依赖,运行该task前会运行这些依赖的task,如果想要他们按顺序运行,需要显式声明dependsOrder

    其他选型

    看到还有可以重定义当前路径等很多详细的功能。

    tasks.json文件配置:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55{"version":"2.0.0","tasks":[{"label":"prerun","type":"shell","command":"source ./devel/setup.zsh && export ROS_MASTER_URI=http://localhost:11311/ "},{"label":"catkin build","type":"shell","command":"catkin","args":["build","-DCMAKE_BUILD_TYPE=Debug"],"group":{"kind":"build","isDefault":true},"presentation":{"reveal":"always"},"problemMatcher":"$msCompile"},{"label":"catkin clean","type":"shell","command":"catkin","args":["clean","-y"],"group":{"kind":"build","isDefault":true},"presentation":{"reveal":"always"},"problemMatcher":"$msCompile"},{"label":"ccb","dependsOrder":"sequence","dependsOn":["catkin clean","catkin build"],"problemMatcher":["$msCompile"]}]}

    2.3 debug配置

    主要是配置launch.json,这里只介绍几个常用参数,详细请参考VSCode中关于Debugging的介绍

    name

    任务的名字,该名字会在VSCode的Debug中显示,用户可选择需要调试的任务。

    tpye

    调试器名称。

    request

    有launch和attach两种方式,前者直接运行,后者将程序绑定到之前启动的程序

    program

    这里需要写生成的二进制路径

    args

    传进去的参数,这里分为ROS参数服务器形式传进去的参数以及以main函数参数传进去的参数,这里介绍的是前者。有兴趣可以Google一下。

    stopAtEntry

    是否在运行前暂停

    cwd

    设置当前路径,如果程序中用的是相对路径,则需要设置该参数为当前路径。

    environment

    环境变量设置

    externalConsole

    是否启动外部终端(默认是用集成终端)

    preLaunchTask

    在启动前启动一个task,这个prerun在前面一节有说,主要是设置source当前ROS路径等

    postDebugTask

    运行完了之后启动的task,节点运行完了进行清理工作

    MIMode

    调试器名称

    setupCommands

    是给gdb的参数

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29{"version":"0.2.0","configurations":[{"name":"cloud_node","type":"cppdbg","request":"launch","program":"${workspaceFolder}/devel/.private/rslidar_pointcloud/lib/rslidar_pointcloud/cloud_node","args":["_model:=RS16","_resolution_type:=1.0cm"],"stopAtEntry":false,"cwd":"${workspaceFolder}","environment":[],"externalConsole":false,"preLaunchTask":"prerun","MIMode":"gdb","avoidWindowsConsoleRedirection":true,"setupCommands":[{"description":"Enable pretty-printing for gdb","text":"-enable-pretty-printing","ignoreFailures":true}]}]}

    2.4 多任务调试

    根据VSCode中关于Debugging的介绍,可以启动完一个任务后再启动另外一个即可同时debug多个。

    写完多个节点后,可以通过compounds来进行配置,但compounds不能确保顺序执行,尝试通过preLaunchTask延时2秒启动来实现顺序执行,但preLaunchTask任务启动的终端跟节点启动的终端不是同一个。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10"compounds":[{"name":"rslidar","configurations":["rslidar_node","cloud_node","rviz_node"]}]

    另外还有一个问题是,不知道怎么确保同一个程序下次运行还用同一个终端,现在是会新建一个终端,每次重启就新建一个,多次之后就一堆要自己删。

    todo feature

    参考

    喜欢我的文章的话Star一下呗Star

    版权声明:本文为白夜行的狼原创文章,未经允许不得以任何形式转载

    如果你觉得这篇文章帮你节省了时间,增长了知识,请支持我写出更多这样的文章

    打赏

    微信支付

    支付宝

    展开全文
  • 以此下文中的例子作为参考,学习如何使用ROShttps://zhuanlan.zhihu.com/p/152662055注:使用的是ros版本为melodic1、进入工作空间 工作空间类似于一个项目或者解决方案可新建一个工作空间或者进入已有工作空间① ...

    以此下文中的例子作为参考,学习如何使用ROS

    https://zhuanlan.zhihu.com/p/152662055

    注:使用的是ros版本为melodic

    1、进入工作空间

    工作空间类似于一个项目或者解决方案

    可新建一个工作空间或者进入已有工作空间

    ① 新建一个工作空间

    (1)创建文件夹(包括src):
    mkdir -p ~/catkin_ws/src
    (2)进入后初始化工作空间:
    cd ~/catkin_ws/src
    catkin_init_workspace
    (3)在工作空间根目录下编译,编译后在根目录中会出现devel 和build 文件夹 
    cd ..
    catkin_make   
    (4)使环境生效:
    a.临时生效:执行完该命令后,只能从当前的命令行(也叫终端,terminal)执行相关可执行文件
    source ~/catkin_ws/devel/setup.bash
    
    b.永久生效:每次开机之后,可从任意一个命令行中执行相关可执行文件。适用于比较重要的功能包(package),
    即把临时方法那句话加到~/.bashrc文件中,有两种方式
    方式一:
    echo "source ~/catkin_ws/devel/setup.bash">>~/.bashrc
    source ~/.bashrc
    
    方式二:
    gedit ~/.bashrc
    将source ~/catkin_ws/devel/setup.bash 放任意任意,保存并关闭文件
    source ~/.bashrc使整个环境生效

    ②进入已有工作空间

    cd~/catkin_ws

    Q1:工作空间内容简介:

    (1)src:源代码,一般包含多个功能包,功能包由(源码、CMakeList.txt、)

    (2)build:保存编译产生的缓存信息和中间文件

    (3)devel:保存编译后的可执行文件

    (4)install:这不是必须的文件夹,很多工作空间可能没有,执行make install 之后将可执行文件等执行相关文件放到该空间,然后运行该文件夹下的环境变量脚本就可以在终端执行这些可执行文件。

    Q2:catkin_make的发展由来:ROS 编译系统 catkin 详解

    Q3:实现多个工作空间的分离,避免调用同名的包:

    1. 注释掉~/.bashrc中无关的包的bash,只保留想要的工作空间;
    2. source ~/.bashrc
    3. 重新编译你的包catkin_make

    2、安装所需驱动、下载项目和数据集

    ①安装GPS驱动。

    为了能够读取GPS数据,需要安装nmea_navsat_driver(其是一个ROS的功能包),具体过程如下:

    # 在工作空间的src文件夹中下载文件((如果直接下载,名字是nmea_navsat_driver-master,需把-master去掉)
    git clone https://github.com/ros-drivers/nmea_navsat_driver.git
    
    # 切换到对应版本的分支,根据安装的ros来选择
    git checkout melodic-devel
    
    # 进入工作空间根目录,执行编译
    catkin_make

    ②安装nmea_msgs

    在运行程序的过程中提示找不到nmea_msgs,下载并编译nmea_msgs,做法与nmea_navsat_driver类似。

    # 在工作空间的src文件夹中下载文件((如果直接下载,名字是nmea_navsat_driver-master,需把-master去掉)
    git clone https://github.com/ros-drivers/nmea_msgs.git
    
    # 进入工作空间根目录,执行编译
    catkin_make

    ③下载源码:

    也是一个ROS的功能包,解压后放到catkin_ws/src目录编译即 ydsf16/imu_gps_localization

    ④下载数据集rosbag;

    下载链接:EU Long-term Dataset with Multiple Sensors for Autonomous Driving

    关于rosbag 保存和回放数据的具体使用可参考:https://blog.csdn.net/qinqinxiansheng/article/details/107120828

    3、运行

    运行程序:

    roslaunch imu_gps_localization imu_gps_localization.launch 

    查看数据集的信息:

    baa2713d2bb3e902ebf15d3292e038ca.png

    回放数据集:

    rosbag play Your_Folder/utbm_robocar_dataset_20180719_noimage.bag

    查看发布的话题

    rostopic list 

    f024d05ea29587194d73dfe56ae380f0.png

    显示话题内容

    rostopic echo /imu/data

    dace60b5a8110ac744be773c57d3a5ed.png

    8fc4011b6d23f59fe8b19333c148add8.png
    程序运行示意图

    另可用于调试的工具:

    在VS code中调试ROS项目:晓伟Liu:VS Code创建、调试ROS项目

    晓伟Liu:Ubuntu18.04配置VS Code+CMake的C++开发环境

    在Qt中调试ROS项目:https://www.ncnynl.com/archives/201701/1277.html

    参考:

    Catkin编译系统 · 中国大学MOOC---《机器人操作系统入门》讲义

    ROS入门:IMU&GPS融合定位实例_Mr Qin的博客-CSDN博客_ros中如何安装gps

    http://wiki.ros.org/

    http://wiki.ros.org/rosbag/Code%20API

    展开全文
  • 引言在vscode下面配置用于ROS项目开发的环境包括头文件目录的配置,catkin_make命令的配置,GDB debug的配置,以及ROS插件。vscode头文件目录配置安装“c/c++”插件到vscode左边栏的EXTENSIONS中,搜索“C/C++”并...
  • 更受欢迎的开源机器人操作系统ROS已经九岁了。ROS给机器人系统的进程间通讯提供了一个统一的,跨平台的框架,这给经常连接几十个各种各样设备的机器人应用带来了非常大的便利。我也很喜欢使用ROS,以前打Robocup的...
  • 我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS基础知识进行详细的讲解,给不熟悉ROS的朋友起到一个抛砖引玉的作用。本章节主要内容:1.ROS是什么2.ROS系统整体架构3.在ubuntu16.04中...
  • 调试,就要有暂停点(因为语句执行速度太快了),也就是断点程序编译后就可以设置断点(在某行代码按F9,会看到一个深红色的大圆点,还多了一个黄色的箭头!这个黄色的箭头就是表示程序将要执行的语句!根据代码的...
  • 首先,程序从终端获取调试命令,用户可输入数字1,2,3,如果用户输入3会再要求输入kp,ki,kd这三个数,将调试命令转换为通信协议中DEBUG-uart1规定的格式,然后通过串口下发给底盘,实现对底盘的调试调试命令获取与...
  • 当然我们在程序开发调试时不必搞得那么花里胡哨的,直接用一根网线将PC与树莓派连接就可以在桌子上进行程序调试了。树莓派不仅可以接上键鼠等外设,还可以给通过HDMI外接显示器进行开发。实际上如果能承受成本,DIY...
  • VScode debug ROS cpp程序设置 断点调试

    千次阅读 2019-10-21 16:01:06
    在vscode下面配置用于ROS项目开发的环境,通过vscode的debug可以断电调试程序,配置过程虽然有点繁琐但并不是特别复杂,需要更改地方并不是很多, 插件的安装:  通过vscode 左侧的EXTENSIONS 安装ros插件 ...
  • 注意为了更改调试配置,您的代码必须存储在一个文件夹中。 使用Python配置生成launch.json文件: 1.在左侧栏中点击debug按钮选择设置按钮 Debug> Open configurations菜单命令。 2.将从命令选项板打开配置菜单...
  • ROS程序调试

    千次阅读 2018-09-14 11:44:32
    最近在用VS Code进行ROS开发,但是一直遇到打了断点但是不能正常命中的问题 今天学习了一下才知道是没有在CMakeLists.txt中加入调试信息 将下面两行加入到CMakeLists.txt中, set (CMAKE_CXX_FLAGS "${...
  • ros项目调试:ROS项目使用GDB调试

    万次阅读 多人点赞 2018-12-25 21:17:13
    引言 在写ROS工程代码,有时候找一个bug非常麻烦,尤其是运行时出错的bug,...为了避免这种情况,程序编译时要加上debug选项,让cmake以debug模式编译,不然可能会在gdb调试的时候不能跳转到源代码,只能进入断点。 ...
  • 要开发基于ros的qt GUI,必须要利用好调试的功能,否则程序写出来也没法用,不能调试这个问题得认真解决。 打好断点启动调试按钮后就弹出对话框,让我添加ROS Attach to Node并使能,我在project中已经设置好了,...
  • 目录[-] c,c++程序开发时,经常会用到需要进行在线调试方法,我们可以采用断点方式进行调试,同样ros程序...
  • 程序调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。 本文将主要介绍linux下的强大调试工具是怎么完成这些工作的。 之所以要调试程序,是因为程序的运行结果和预期结果不一致,...
  • 此外,还可把cmake工程设置为debug模式,对工程进行断点调试。此外,由于ROS使用的catkin也是cmake的形式,所以还可用它来调试ROS程序。 安装Qt Creator:sudo apt-get install qtcreator Qt Creator IDE的...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

ros程序断点调试