使用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