• 使用QtCreator作为ROS调试器


    如果你用过QtCreator,你一定会喜欢上它。

    流畅的速度,强大的功能,优雅的外观,友好的界面,一切让人如此舒服。而且它支持从命令行作为调试器启动,只需加上-debug exe即可。

    因此我想如果能将其作为ROS的调试器就完美了,可以秒杀一切linux下的其它C/C++调试器。

    但是当前版本的QtCreator有个缺点,就是使用命令行启动调试器的时候,只能指定可执行程序,而不能为可执行程序添加参数,这使其无法作为需要配置大量参数的ROS NODE的调试器。但是这个很好解决,与Qt一样,QtCreater是开源的,我们可以下载源码自己改。

    首先下载代码:

    git clone git://code.qt.io/qt-creator/qt-creator.git

    接下来直接贴改动的代码:

    diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
    index 504fb02..dfb1343 100644
    --- a/src/plugins/debugger/debuggerplugin.cpp
    +++ b/src/plugins/debugger/debuggerplugin.cpp
    @@ -1148,7 +1148,7 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it,
     {
         const QString &option = *it;
         // '-debug <pid>'
    -    // '-debug <exe>[,server=<server:port>][,core=<core>][,kit=<kit>][,terminal={0,1}]'
    +    // '-debug <exe>[,server=<server:port>][,core=<core>][,kit=<kit>][,terminal={0,1}][,args=arg1+..+argn]'
         if (*it == "-debug") {
             ++it;
             if (it == cend) {
    @@ -1195,6 +1195,13 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it,
                         rp.useTerminal = bool(val.toInt());
                     } else if (key == QLatin1String("kit")) {
                         kit = KitManager::find(Id::fromString(val));
    +                } else if (key == QLatin1String("args")) {
    +                  if (rp.inferior.commandLineArguments.isEmpty())
    +                  {
    + auto rpspace = val.replace(QRegularExpression(QLatin1String("\+\+")), QLatin1String(" "));
    + auto rpequ = rpspace.replace(QRegularExpression(QLatin1String("\+\:")), QLatin1String(":="));
    + rp.inferior.commandLineArguments = rpequ;
    +                  }
                     }
                 }
             }

    上面代码可以作为patch直接在git中apply,也可以手动改。这里的改动很简单,就是增加了一个参数叫args,该参数分隔符是加号'+',这是为了避免空格。在解析的时候将加号'+'替换为空格即可。

    唯一要注意的是这里用的是正则替换,因此正则表达式中加号前面要加转义字符,在c++的字符串中需要用两个\表示一个实际的。

    修改完成后编译即可。漫长的等待后编译完成,会生成bin,lib,libexec,share这样几个文件夹,拷贝到任意文件夹。如果代码的版本和当前安装的qtcreator版本相同,则直接用编译出来的lib/qtcreator/plugins/libDebugger.so 替换掉当前安装的qtcreator下相同文件即可。如果代码版本与当前安装的qtcreator版本不同,则需要将当前qtcreator下的lib/Qt这个文件夹拷贝到编译生成的lib文件夹下,并从当前安装的qtcreator的bin文件夹下拷贝qt.conf到编译生成的bin文件夹下。

    之后假设新的qtcreator的路径是QTDBG_ROOT,其下有bin,lib,libexec,share四个文件夹。

    编写如下bash代码并保存为qtdbg-ros

    #!/bin/bash
    
    QTDBG=${QTDBG_BIN}/qtcreator.sh
    
    PROGRAM=$1
    shift
    ARGS=$@
    
    EXEC=${QTDBG}
    
    if [ ! -z ${PROGRAM} ]; then
        EXEC="${EXEC} -debug ${PROGRAM}"
    fi
    
    if [ $# -gt 0 ]; then
        ARGS_E=",args="
        for i in ${ARGS}; do
            ARGS_E="${ARGS_E}++${i}"
        done
        ARGS_E=${ARGS_E//:=/+:}
        EXEC="${EXEC}${ARGS_E}"
    fi
    
    echo ${EXEC}
    ${EXEC}

    保存后运行

    chmod +x qtdbg-ros

    之后即可使用

    在ros工程的blabla.launch文件中为node加入launch-prefix属性:

    <launch>
      <arg name="debugger" default="" />
      <node pkg="blabla" type="blabla_node" name="blabla" launch-prefix="$(arg debugger)">
    </launch>

    在bash环境下运行

    roslaunch blabla blabla.launch debugger:=qtdbg-ros

    enjoy.

    最后附上我编译好的qtcreator,版本有点差,编了最新的master版,不是官方release的4.2版,但不影响用。

    https://pan.baidu.com/s/1qY34xBY

  • 相关阅读:
    IO模型
    Linux获取CPU,内存和硬盘信息
    让eclipse变得快点,取消validation
    axure 使用笔记
    linux所有硬盘给了一个分区了,然后要从这个分区中拿出部分空间,创建一个新的分区。如何做到?
    maven安装与配置
    svn 使用笔记
    git 使用笔记
    北邮校内网络认证===python脚本实现
    配置javac环境
  • 原文地址:https://www.cnblogs.com/astreye/p/6266691.html
Copyright © 2020-2023  润新知