如果你用过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. UIApplication详解再解-备

    每个app有且只有一个UIApplication对象,当程序启动的时候通过调用UIApplicationMain方法得到的.可以通过sharedApplication方法得到. UIApplicati ...

  2. POJ 1225 Substrings

    http://poj.org/problem?id=1226 题意:给定n个串.求一个最长的串,使得这个串或者其反串在每个串中都出现过? 思路:先在大串里面加入正反串,然后二分,判定即可. #incl ...

  3. 面试题 41 和为s的两个数字VS 和为S的连续整数序列

    (1)和为S的两个数字 bool findNumberWithSum(int data[], int length, int sum, int &numb1, int &numb2){ ...

  4. Android XML文档解析(一)——SAX解析

    ---------------------------------------------------------------------------------------------------- ...

  5. 【转】Install SmartGit via PPA in Ubuntu 13.10/13.04/12.04/Linux Mint

    原文网址:http://ubuntuhandbook.org/index.php/2013/09/install-smartgit-via-ppa-ubuntu-linux-mint/ This tu ...

  6. VS2012 中使用Emacs布局

    微软的反开源行为导致它不断的衰落,问题是还不反省. 下面这篇文章介绍了如何安装emacs布局的插件: http://marxistprogrammer.blog.163.com/blog/static ...

  7. c语言验证哥德巴赫猜想(从4开始 一个偶数由两个质数之和)

    #include <stdio.h> #include <stdlib.h> #include <math.h> int isit(int num) { int i ...

  8. web.xml中contextConfigLocation的作用(转)

    原文地址:http://blog.csdn.net/zhangliao613/article/details/6289114 原文格式较乱,此处略作整理.内容未变. 在web.xml中使用contex ...

  9. Laravel-表单篇-零散信息

    1.asset('path'):用于引入静态文件,包括css.js.img 2.分页,调用模型的paginate(每页显示的行数)方法, 如$student = Student::paginate(2 ...

  10. [置顶] STM32移植contiki进阶之三(中):timer 中文版

    鉴于自己英语水平不高,在这里,将上一篇关于contiki 的timer的文章翻译为中文,让自己在学习的时候,更方便点.文中有许多不是很通顺的地方,将就吧. Timers Contiki系统提供了一套时 ...