如果你用过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
--- 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=$
shift
ARGS=$@ EXEC=${QTDBG} if [ ! -z ${PROGRAM} ]; then
EXEC="${EXEC} -debug ${PROGRAM}"
fi if [ $# -gt ]; 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

使用QtCreator作为ROS调试器的更多相关文章

  1. 关于qtcreator+vs2008+CDB调试太卡的问题研究(载入符号表,以及VS调试器的注册表信息)

    在刚接触Qt时,对于较大的项目,用qtcreator + vs + cdb 调试时,启动很慢并且单步运行时也经常会出现卡住半分钟以上的情况,一直没有解决.在需要debug的时候大多会在vs2008上安 ...

  2. 配置QtCreator+CDB远程调试环境(要设置_NT_SYMBOL_PATH和QT_PLUGIN_PATH和Path)

    相关环境信息:开发机Win7 x64.远程机器WinXP.调试器是CDB.Qt版本5.2.1 一.部署远程机器环境 我这里用的是虚拟机(Windows XP),根据你要调试的程序选择安装不同架构的Wi ...

  3. ubuntu12.04下Qt调试器的使用

    最近,我一直在用Qt编写C++程序,但在编写过程中遇到了问题,想用Qt Creator中的调试器调试一下,但调试时(在Qt Creator中已配置好相应的调试器)出现“ ptrace:Operatio ...

  4. Qcreator3.1.2调试器(windows)版本

    环境:visual studio 2012 qt:5.3.1 默认的ms版本qtcreator只能使用visual studio的编译器,不能使用调试工具.需要gdb或者cdb进行调试,这里介绍使用的 ...

  5. 配置QtCreator+CDB远程调试环境(用到了符号表) good

    相关环境信息:开发机Win7 x64.远程机器WinXP.调试器是CDB.Qt版本5.2.1 一.部署远程机器环境 我这里用的是虚拟机(Windows XP),根据你要调试的程序选择安装不同架构的Wi ...

  6. Qt Creator配置MSVC调试器

    安装完QT后会看到Qt Creator中的MSVC构建组件带有黄色的感叹号,那是因为没有调试器的原因.由于Qt-MSVC版本套件没有默认安装调试器, 需要我们自己手动下载安装. 根据官方文档http: ...

  7. 选择目录,选择文件夹的COM组件问题。在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。

    异常: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 只有将调试器附加到该进程才会引发此异常. ...

  8. [连载]《C#通讯(串口和网络)框架的设计与实现》- 11.调试器的设计

    目       录 第十一章     调试器设计... 2 11.1         调试接口... 2 11.2         界面方式调试... 3 11.3         命令行方式调试.. ...

  9. 带调试器(Debugger)的ILSpy(2.2.0.1738)

    2015-03-13 09:40更新: 感谢@dark89757园友提出的调试时不能查看变量的问题. 源码已修改,并提交到了github. 请查看最新发布,二进制文件和源码都在这里: 调试时可查看变量 ...

随机推荐

  1. iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习

    iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习 如果你不希望应用运行时 iPhone 进入锁屏待机状态,加入下面这行代码即可 [[UIApplication share ...

  2. commons-pool2-中的一些配置

      /**                     * 连接失效检测相关                     */                    // 空闲时进行连接测试,会启动异步evi ...

  3. Oracle 提示密码过期问题:the password will expire

    SQL> conn scott/tiger ERROR: ORA: the password will expire within days Connected. SQL> conn /a ...

  4. Bash 使用技巧大补贴

    https://linuxtoy.org/archives/the-best-tips-and-tricks-for-bash.html

  5. 带KEY的SCP命令,老是要查,这次写在这里吧,

    有些东东记不住,急要用时老是想不起,放在这里吧, scp -r -i /xxx/rsa.key -P port user@ip:/source/ /target/

  6. 自制单片机之十五……可串行驱动LCD12864的应用

    在网上搜了一下,ST7920控制器的LCD产品可以提供8位,4位并行和串行接口可选,并行的控制接口的LCD较多,前面的贴子也介绍过,我们在这儿不说了,这儿我们讲的是串口控制LCD12864. 买了块S ...

  7. mv,Directory not empty不能目录覆盖

    一.mv /test1/* /test2/test1rm -rf /test1 二. You can however use rsync with the --remove-source-files ...

  8. FROM CSDN TO CNBLOGS

    做出了一个愉快的决定,以后会将博客从CSDN迁移到CNBLOGS 旧地址:http://blog.csdn.net/fifa0329,文章并不多 原因如下: 我再次出现了该博客违反了网站规则被关闭的问 ...

  9. hdu3308--LCIS 最大连续递增序列长度

    这个是动态的,所以要用线段树维护.代码里有注释因为ls敲成lsum,rs敲成rsum查错查了好久.. #include <set> #include <map> #includ ...

  10. ibatis学习之道:ibatis的<[CDATA]>dynamic属性跟#$的应用

    ibatis的<![CDATA]>,dynamic属性和#,$的应用 <![CDATA[   ]]>的正确使用 ibatis作为一种半自动化的OR Mapping工具,其灵活性 ...