ROSを使ってC++のコードを書いた時にgdbでデバッグするときに,rosrunやroslaunchを使った方法を日本語で簡単に解説しているサイトがあまりないので書き留めます.
準備
gdbを使用するためには,デバッグ情報を付与する必要があります.
catkin_make,もしくはcatkin toolsでは以下のようにしてデバッグ情報付きでビルドをすることができます.
# catkin_makeの場合
catkin_make -DCMAKE_BUILD_TYPE=Debug
# catkin_toolsの場合
catkin build -DCMAKE_BUILD_TYPE=Debug
rosrunでgdbを利用する
rosrunではindigo以降,--prefix
オプションを利用することでgdbなどを利用できるようになりました.以下のように使用します.
# 同じターミナル内で実行する場合
rosrun --prefix 'gdb --args' pkg_name node_name
# 別のウィンドウにターミナルを開いて実行する場合
rosrun --prefix 'gnome-terminal -x gdb --args' package_name node_name
roslaunchでgdbを利用する
roslaunchでは<node>
タグにlaunch-prefix
属性を用いることでgdbなどを利用することができます.以下のようなlaunchファイルを作成して使用します.
<launch>
<node pkg="pkg_name" type="node_name" name="name" launch-prefix="gdb --args"/>
</launch>
launch-prefix
の値を変更することで,rosrunで実行する場合と同様に,別のウィンドウにターミナルを開いて,デバッグしたいノード以外の挙動を見ながらデバッグすることも可能です.
#おわりに
ROSでgdbが使えると,自分が書いたコードをデバッグ出来るだけでなく,Navigation stackなどの有名パッケージの動作について,内部の挙動を見ながら理解することが可能になり,非常に便利です.
余談ですが,rosrunの--prefix
オプションやroslaunchのlaunch-prefix
属性では,gdbだけでなく,メモリデバッグツールであるValgrindやPythonのデバッガであるpdbを使用することもできます.