如果你用过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. 对于Android的线程和线程池的理解

    Android的消息机制,主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue 和 Looper的支撑,MessageQueue中文名消息队列,它的内部存储了一组消 ...

  2. Codeforces 525E Anya and Cubes

    http://codeforces.com/contest/525/problem/E 题意: 有n个方块,上面写着一些自然数,还有k个感叹号可用.k<=n 你可以选任意个方块,然后选一些贴上感 ...

  3. java集合经常出现空指针问题的解决方案

    我自己问自己这个问题的时候都把自己给雷住了,但是现实如此,经常写的程序就是出现空指针的错误. 如: public List add(){ List list=null; try { list=new ...

  4. hdu5035:概率论推公式

    题目大意: 你要去邮局发一个包裹,有n个窗口,每个都有人,每一个窗口完成一次服务的时间 ti 的分布符合几何分布:ki*e^(-ki*t) 每个窗口当前服务已经进行了ci时间 你会去第一个完成当前服务 ...

  5. HDU 3586 : Information Disturbing

    Problem Description In the battlefield , an effective way to defeat enemies is to break their commun ...

  6. JavaScript 中的正常任务与微任务

    正常情况下,JavaScript的任务是同步执行的,即执行完前一个任务,然后执行后一个任务.只有遇到异步任务的情况下,执行顺序才会改变. 这时,需要区分两种任务:正常任务(task)与微任务(micr ...

  7. Makefile学习(一)变量

    鉴于之前有一些了解,还有自己的学习习惯,我一上来就看Makefile的变量这一章.主要脉络是根据GNU make中文手册. 第六章:Makefile中的变量 6使用变量 定义:变量是一个名字,代表一个 ...

  8. java.lang.OutOfMemoryError: Java heap space错误及处理办法

      以下是从网上找到的关于堆空间溢出的错误解决办法: java.lang.OutOfMemoryError: Java heap space ============================= ...

  9. UIActivityIndicatorView-初识IOS

    UIActivityIndicatorView是一个加载动画的视图,一般加载一个网页页面之前会经常用到. 上一个随笔,我讲到了页面加载的页面的那些代理方法 - (void) viewWillAppea ...

  10. python-登录-注册-修改密码

    该脚本实现了,登录,注册,修改密码功能. #!/usr/bin/env python # -*- coding:utf-8 -*- #pangguoping import os def login(u ...