├── .gitignore ├── CMakeLists.txt ├── Coredump.md ├── Doc ├── How CUDA Programming Works.pdf ├── cmakeadvanced.pdf ├── cmake项目管理.pdf ├── cuda.pdf ├── nsight.pdf ├── test2.pdf └── test4.pdf ├── Figures └── notes │ ├── Coredump.png │ ├── Coredumpexample1.png │ ├── Coredumpexample2.png │ ├── README.md │ ├── ROS VSCode_eigendebug.pdf │ ├── cachemiss.png │ ├── cudadebug.png │ ├── gperftools.png │ ├── gperftools_withros.md │ ├── nsys1.png │ ├── nsys2.png │ ├── pprof.pdf │ ├── pprof2.pdf │ ├── profiling1.pdf │ ├── profiling2.pdf │ ├── profiling_roslaunch_prefix.md │ ├── valgrind_cachegrind_Kcachegrind.jpeg │ ├── 优化前discrete_parallel优化部分.jpeg │ ├── 优化前discrete_sequential.jpeg │ └── 分析核心转储文件.png ├── LICENSE.txt ├── Profiling.md ├── Readme.md ├── debug-support.md └── media ├── documentation ├── Coredump.png ├── debug-support │ ├── attach-to-cpp.gif │ ├── attach-to-python.gif │ ├── check-roscore-status.gif │ ├── create-attach-debug-config.gif │ ├── create-launch-debug-config.gif │ ├── launch-and-debug-nodes.gif │ └── ros2-launch-debug.gif ├── download-vsix-artifact.png ├── draft-release.png ├── git-fork.png ├── pipeline-manual-release.png └── spec │ └── debug-ros-nodes │ ├── architecture.png │ ├── attach-debug.png │ ├── debug-flow.png │ ├── execute-a-debug-configuration.png │ └── launch-debug.png └── icon.png /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/.gitignore -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.10) 2 | project(MyProject) 3 | set(CMAKE_BUILD_TYPE "Release") 4 | ADD_COMPILE_OPTIONS(-std=c++14 ) 5 | set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g") 6 | #!!!!!!!!!!sanity check for compiler flags!!!!!!!!!! 7 | add_compile_options( 8 | -Wall 9 | -Wextra 10 | -Weffc++ 11 | -Werror=uninitialized 12 | -Werror=return-type 13 | -Wconversion 14 | -Werror=unused-result 15 | -Werror=suggest-override 16 | -Wzero-as-null-pointer-constant 17 | -Wmissing-declarations 18 | -Wold-style-cast 19 | -Wnon-virtual-dtor 20 | ) 21 | #!!!!!!!!!!sanity check for compiler flags!!!!!!!!!! 22 | 23 | # Include directories 24 | include_directories(${PROJECT_SOURCE_DIR}/include) 25 | set(SOURCE_FILES 26 | src/main.cpp 27 | ) 28 | add_executable(MyProject ${SOURCE_FILES}) 29 | # target_link_libraries(MyProject PRIVATE some_library) 30 | -------------------------------------------------------------------------------- /Coredump.md: -------------------------------------------------------------------------------- 1 | # coreDump:debug 2 | ## 注意Debug模式编译ros节点,去掉-O3优化,Release等 3 | - 概念参见[三步搞定ROS进程崩溃-Core Dump](https://zhuanlan.zhihu.com/p/459530578),详情如下![](Figures/notes/Coredump.png) 4 | ### 推荐安装工具 5 | - sudo apt install systemd-coredump 6 | - sudo apt install ros-noetic("DISTRIBUTION")-rosmon 7 | 使用[monlaunch](https://github.com/xqms/rosmon)代替roslaunch后启动节点,可用如下命令代替gdb传统方式对coredump文件分析 8 | ```cpp 9 | coredumpctl gdb COREDUMP_PID=xxxxx 10 | 然后使用bt或者bt full查看函数栈之Backtraces定位某一行代码 11 | ``` 12 | ![](Figures/notes/Coredumpexample1.png) 13 | 补充博客参见["在 Linux 上创建并调试转储文件"](https://blog.csdn.net/weixin_33941707/article/details/112592730)使用systemd-coredump,或参见本地文件(Figures/notes/分析核心转储文件.png) 14 | 15 | 16 | 17 | ## 注意修改Linux默认4G的转储文件大小限制,避免转储文件过大被截断 18 | - sudo vim /etc/systemd/coredump.conf 注意取消注释,ProcessSizeMax,ExternalSizeMax与JournalSizeMax 19 | ```cpp 20 | [Coredump] 21 | #Storage=external 22 | #Compress=yes 23 | ProcessSizeMax=8G 24 | ExternalSizeMax=8G 25 | JournalSizeMax=8G 26 | #MaxUse= 27 | #KeepFree= 28 | ``` 29 | 30 | -------------------------------------------------------------------------------- /Doc/How CUDA Programming Works.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Doc/How CUDA Programming Works.pdf -------------------------------------------------------------------------------- /Doc/cmakeadvanced.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Doc/cmakeadvanced.pdf -------------------------------------------------------------------------------- /Doc/cmake项目管理.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Doc/cmake项目管理.pdf -------------------------------------------------------------------------------- /Doc/cuda.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Doc/cuda.pdf -------------------------------------------------------------------------------- /Doc/nsight.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Doc/nsight.pdf -------------------------------------------------------------------------------- /Doc/test2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Doc/test2.pdf -------------------------------------------------------------------------------- /Doc/test4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Doc/test4.pdf -------------------------------------------------------------------------------- /Figures/notes/Coredump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/Coredump.png -------------------------------------------------------------------------------- /Figures/notes/Coredumpexample1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/Coredumpexample1.png -------------------------------------------------------------------------------- /Figures/notes/Coredumpexample2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/Coredumpexample2.png -------------------------------------------------------------------------------- /Figures/notes/README.md: -------------------------------------------------------------------------------- 1 | # notes 2 | # GPU profiling (见/我的坚果云/计算机) 3 | - nsys profile -t nvtx,cuda --stats=true -f true -o withouteigen terrain_analyzer 4 | nsight-sys 5 | # GPU cuda 编程debug 6 | set(CMAKE_BUILD_TYPE Debug)不够,注意设置-g -G的flag为host与device的调试信息如下,同时安装插件nsight-vscode。主要thread是32为单位增加的,设置时不能随意设置如下 7 | ![thread id注意设置为32的整数倍数](cudadebug.png) 8 | ```cpp 9 | cmake_minimum_required(VERSION 3.10) 10 | 11 | set(CMAKE_CXX_STANDARD 17) 12 | set(CMAKE_BUILD_TYPE Debug) 13 | set(CMAKE_CUDA_ARCHITECTURES 52;70;75;86) 14 | 15 | project(hellocuda LANGUAGES CXX CUDA) 16 | 17 | add_executable(main main.cu) 18 | if(CMAKE_BUILD_TYPE STREQUAL "Debug") 19 | target_compile_options(main PRIVATE $<$:-G -g>) 20 | endif() 21 | target_include_directories(main PUBLIC ../../include) 22 | ``` 23 | # Valgrind & callgrind &cachegrind & 再使用kcachegrind分析相对而言更加好用,详细参见profiling_roslaunch_prefix.md 24 | - 参见roslaunch_Tutorials_Profiling roslaunch nodes - ROS Wiki.pdf与roslaunch_Tutorials_Roslaunch Nodes in Valgrind or GDB - ROS Wiki.pdf 25 | ## 注意输出的文件在~/.ros/下,一般情况下不制定--cachegrind-out-file或者--callgrind-out-file,方便kcachegrind导入 26 | ### kcachegrind callgrind.out.158364或者kcachegrind cachegrind.out.170407类似,GUI有时候不能找到文件,命令行打开 27 | 28 | ```cpp 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | ``` 37 | # gperftools分析内存与cpu占用,官方文档 38 | 39 | https://gperftools.github.io/gperftools/cpuprofile.html 40 | 41 | https://github.com/ethz-asl/programming_guidelines/wiki/Profiling-Code 42 | 43 | 个人尝试推荐使用方法3,参见图片gperftools 中 CPU Profiler 不工作问题的解法.png比方法一二靠谱 44 | 具体例如ego_planner_node: 45 | 46 | ```cpp 47 | #include 48 | #include 49 | #include 50 | #include 51 | 52 | using namespace ego_planner; 53 | 54 | int main(int argc, char **argv) 55 | { 56 | ProfilerStart("/home/ztr/Pipline-Swarm-Formation/heap/ego_planner_node.prof"); 57 | HeapProfilerStart("/home/ztr/Pipline-Swarm-Formation/heap/ego_planner_node_memory.log"); 58 | ros::init(argc, argv, "ego_planner_node"); 59 | ros::NodeHandle nh("~"); 60 | 61 | EGOReplanFSM rebo_replan; 62 | 63 | rebo_replan.init(nh); 64 | 65 | // ros::Duration(1.0).sleep(); 66 | ros::spin(); 67 | HeapProfilerStop(); 68 | ProfilerStop(); 69 | return 0; 70 | 71 | //对应CMakeLists.txt多出一些行数如 72 | 73 | target_link_libraries(ego_planner_node 74 | ${catkin_LIBRARIES} 75 | profiler //链接上profiler,分析CPU需要, 76 | tcmalloc//分析内存则需要!!!!重要,参见https://gperftools.github.io/gperftools/heapprofile.html 77 | ) 78 | set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-as-needed") #https://stackoverflow.com/questions/24532853/how-can-i-add-linker-flag-for-libraries-with-cmake 79 | 80 | 81 | } 82 | // 最后如下分析 83 | google-pprof --pdf devel/lib/ego_planner/ego_planner_node heap/ego_planner_node.prof > test.pdf 84 | ``` 85 | 86 | # 获得所有函数调用的情况 87 | 88 | //然后为了显示出全部函数调用的情况,需要在各个link的库中添加头文件,添加代码避免被编译器优化,具体原因的如“gperftools 中 CPU Profiler 不工作问题的解法.png“显示,操作流程为”性能分析.png“,伦哥分支当中操作。 89 | ```cpp 90 | 91 | #include 92 | 93 | 并且代码当中添加如下 94 | 95 | volatile bool tmp = false; 96 | if (tmp) ProfilerStop(); 97 | 98 | CMakeLists.txt中链接profiler如下 99 | 100 | target_link_libraries( traj_opt 101 | 102 | ${catkin_LIBRARIES} 103 | 104 | profiler 105 | 106 | ) 107 | 108 | target_link_libraries( plan_env 109 | 110 | ${catkin_LIBRARIES} 111 | 112 | ${PCL_LIBRARIES} 113 | 114 | profiler 115 | 116 | ) 117 | 等等,最后结果如test2.pdf所示。内存分析结果如test4.pdf 118 | ``` 119 | 120 | 121 | # coreDump:debug 122 | 123 | https://zhuanlan.zhihu.com/p/459530578结合https://blog.csdn.net/weixin_33941707/article/details/112592730:使用systemd-coredump 124 | 125 | 126 | sudo apt install systemd-coredump 127 | 修改core dump大小 128 | 129 | ## sudo vim /etc/systemd/coredump.conf 注意取消注释,ProcessSizeMax,ExternalSizeMax与JournalSizeMax 130 | 131 | [Coredump] 132 | #Storage=external 133 | #Compress=yes 134 | ProcessSizeMax=8G 135 | ExternalSizeMax=8G 136 | JournalSizeMax=8G 137 | #MaxUse= 138 | #KeepFree= 139 | 140 | # 制定cmake特定版本找到cmakeconfig 141 | 142 | sudo ln -sf /usr/local/include/pcl-1.12/pcl /usr/include/pcl 143 | set(PCL_DIR "/usr/local/share/pcl-1.12/") 144 | 145 | ## 一定注意上述目录中/不能少set(PCL_DIR "/usr/local/share/pcl-1.12")是错的,必须有/ ,指代/usr/local/share/pcl-1.12/文件夹下是PCLConfig.cmake文件 146 | 147 | sudo apt install systemd-coredump 148 | 149 | # make VERBOSE=1 150 | 151 | 尝试cmake直接编译ros2包,如果有问题? 152 | 153 | # 单步debug 154 | 155 | lldb 插件vscode-lldb 156 | llvm 157 | 158 | ```json 159 | vscode ros_debug 设置 160 | //安装sudo apt-get install python3-catkin-tools 161 | //catkin_tools 162 | 参考:https://answers.ros.org/question/313371/vscode-debug-cpp-ros-node/ 163 | https://haoqchen.site/2019/08/15/debug-ros-with-vscode/ 164 | https://github.com/ms-iot/vscode-ros/blob/master/doc/debug-support.md 165 | 记得编译是要catkin_make -DCMAKE_BUILD_TYPE=RelWithDebInfo或者Debug 166 | 167 | 168 | -------------------------------------------------------------------------------- /Figures/notes/ROS VSCode_eigendebug.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/ROS VSCode_eigendebug.pdf -------------------------------------------------------------------------------- /Figures/notes/cachemiss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/cachemiss.png -------------------------------------------------------------------------------- /Figures/notes/cudadebug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/cudadebug.png -------------------------------------------------------------------------------- /Figures/notes/gperftools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/gperftools.png -------------------------------------------------------------------------------- /Figures/notes/gperftools_withros.md: -------------------------------------------------------------------------------- 1 | ### GProf: non intrusive overall timing. 2 | 3 | Official doc with information about how to interpret the output: [https://github.com/gperftools/gperftools/blob/master/docs/cpuprofile.html](https://github.com/gperftools/gperftools/blob/master/docs/cpuprofile.html) 4 | 5 | #### Short documentation: 6 | 7 | Install google performance tools: 8 | 9 | **Ubuntu** 10 | 11 | ```bash 12 | sudo apt-get install google-perftools libgoogle-perftools-dev graphviz 13 | ``` 14 | 15 | **OSX** 16 | Newer (2018) instructions can be found [here](https://stackoverflow.com/questions/22623934/how-to-install-gprof-on-os-x/49662636#49662636). 17 | 18 | ```bash 19 | brew install google-perftools graphviz 20 | ``` 21 | 22 | ### CPU Profiling 23 | 24 | Then when you run your code, you need to define CPUPROFILE and LD_PRELOAD 25 | 26 | **Ubuntu** 27 | 28 | ```bash 29 | CPUPROFILE=/tmp/my_executable.prof LD_PRELOAD=/usr/lib/libprofiler.so.0 ./my_executable 30 | ``` 31 | 32 | **OSX** 33 | 34 | ```bash 35 | CPUPROFILE=/tmp/my_executable.prof DYLD_INSERT_LIBRARIES=/usr/local/Cellar/google-perftools/2.1/lib/libprofiler.dylib ./my_executable 36 | ``` 37 | 38 | **Ubuntu 18.04** 39 | 40 | In Ubuntu 18.04 `libprofiler.so` is locate at: 41 | 42 | ```bash 43 | /usr/lib/x86_64-linux-gnu/libprofiler.so 44 | ``` 45 | 46 | Finally, generate the call-graph pdf: 47 | 48 | **Ubuntu** 49 | 50 | ```bash 51 | google-pprof --pdf my_executable /tmp/my_executable.prof > my_executable_profiling.pdf 52 | ``` 53 | 54 | **OSX** 55 | 56 | ``` 57 | pprof --pdf my_executable /tmp/my_executable.prof > my_executable_profiling.pdf 58 | ``` 59 | 60 | The call graph then looks like: 61 | 62 | *** 63 | 64 | ![](http://google-perftools.googlecode.com/svn/trunk/doc/pprof-test.gif) 65 | 66 | *** 67 | 68 | **CPU Profiling with ROS on Ubuntu** 69 | 70 | Profiling with as roslaunch is easy, since all subprocesses get captured automatically. 71 | 72 | First, run roslaunch with the profiler: 73 | 74 | ``` 75 | env CPUPROFILE=/tmp/my_executable.prof LD_PRELOAD=/usr/lib/libprofiler.so.0 roslaunch dvs_tracking slam_ros.launch 76 | ``` 77 | 78 | Second, find out the PID of the node you want to profile. 79 | It is printed with every _LOG(INFO)_ command. 80 | 81 | Finally, generate the PDF call graph (replace PATH_TO_EXECUTABLE and PID): 82 | 83 | ``` 84 | google-pprof --pdf /home/odroid/catkin_ws/devel/lib/PATH_TO_EXECUTABLE /tmp/my_executable.prof_PID > profile.pdf 85 | ``` 86 | 87 | **Warning:** Your node has to shut down properly in order to write the profile to disk. If it doesn't, the profile could be empty. 88 | 89 | *** 90 | 91 | Other useful variables: 92 | 93 | ``` 94 | CPUPROFILE_FREQUENCY=x 95 | ``` 96 | 97 | where the default x = 100 (value is in Hz). 98 | 99 | ### sm::timing: detailed but intrusive timing. 100 | 101 | ```c++ 102 | // Pull in the sm_timing definitions 103 | #include 104 | 105 | //Enable timing. 106 | typedef sm::timing::Timer Timer; 107 | 108 | //Disable timing by switching the typedef. 109 | typedef sm::timing::DummyTimer Timer; 110 | ``` 111 | 112 | After adding this definition you can now time specific code segments by adding a timer call: 113 | 114 | ```c++ 115 | Timer expensive_operation_timer("ExpensiveOperation"); 116 | DoExpensiveOperation(); 117 | expensive_operation_timer.Stop(); 118 | ``` 119 | 120 | When you want to print out the timing information you call: 121 | 122 | ```c++ 123 | sm::timing::Timing::Print(std::cout); 124 | //or similarly 125 | LOG(INFO) << sm::timing::Timing::Print(); 126 | ``` 127 | 128 | You will get a table containing the following information: 129 | 130 | ``` 131 | SM Timing 132 | --------- 133 | //a b c d e f g 134 | ExpensiveOperation 5 00:00:09:00.12 (00:00:08:56.67 +- 00:00:00.15) [00:00:08.00 00:00:09.000] 135 | ``` 136 | 137 | Where the columns denote: 138 | 139 | a) Name of the timer. 140 | b) Number of calls. 141 | c) Overall time of all calls. 142 | d) Mean time of a call. 143 | e) Std-dev of the times. 144 | f) Min time of a call. 145 | g) Max time of a call. 146 | 147 | ### Memory profiling 148 | 149 | Then when you run your code, you need to define CPUPROFILE and LD_PRELOAD 150 | 151 | **Ubuntu** 152 | 153 | ```bash 154 | HEAPPROFILE=/tmp/mybin.hprof LD_PRELOAD=/usr/lib/libtcmalloc.so.4 ./my_executable 155 | ``` 156 | 157 | **OSX** 158 | 159 | ```bash 160 | HEAPPROFILE=/tmp/mybin.hprof DYLD_INSERT_LIBRARIES=/usr/local/Cellar/google-perftools/2.1/lib/libtcmalloc.dylib ./my_executable 161 | ``` 162 | 163 | Finally, generate the call-graph pdf: 164 | 165 | **Ubuntu** 166 | 167 | ```bash 168 | google-pprof --pdf my_executable /tmp/profile.0001.heap > my_executable_heap_profiling.pdf 169 | ``` 170 | 171 | **OSX** 172 | 173 | ``` 174 | pprof --pdf my_executable /tmp/profile.0001.heap > my_executable_heap_profiling.pdf 175 | ``` 176 | 177 | Depending on your [settings](https://github.com/gperftools/gperftools/blob/master/docs/heapprofile.html) you will get many *.heap files that are created during the lifetime of your application. -------------------------------------------------------------------------------- /Figures/notes/nsys1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/nsys1.png -------------------------------------------------------------------------------- /Figures/notes/nsys2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/nsys2.png -------------------------------------------------------------------------------- /Figures/notes/pprof.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/pprof.pdf -------------------------------------------------------------------------------- /Figures/notes/pprof2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/pprof2.pdf -------------------------------------------------------------------------------- /Figures/notes/profiling1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/profiling1.pdf -------------------------------------------------------------------------------- /Figures/notes/profiling2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/profiling2.pdf -------------------------------------------------------------------------------- /Figures/notes/profiling_roslaunch_prefix.md: -------------------------------------------------------------------------------- 1 | # Setup 2 | 3 | sudo apt-get install gdb gdbserver oprofile valgrind 4 | sudo apt-get install linux-tools-`uname -r` # perf 5 | 6 | 7 | ## Running ROS node within gdb or valgrind (http://wiki.ros.org/roslaunch/Tutorials/Roslaunch%20Nodes%20in%20Valgrind%20or%20GDB) 8 | 9 | *************************************************************************************************** 10 | - Attach gdbserver to ROS node 11 | - Allows remote debugging 12 | 13 | http://wiki.eclipse.org/CDT/User/FAQ#How_do_I_debug_a_remote_application.3F 14 | 15 | http://doc.qt.io/qtcreator/creator-debugger-operating-modes.html 16 | 17 | launch-prefix="gdbserver localhost:1337" 18 | 19 | 20 | *************************************************************************************************** 21 | Attach gdb to ROS node 22 | 23 | launch-prefix="terminator -mx gdb -ex run --args" 24 | 25 | 26 | *************************************************************************************************** 27 | - Attach perf to ROS node 28 | - Output in ~/.ros/ 29 | - Compile node with -DCMAKE_BUILD_TYPE=RelWithDebInfo for easier results analysis 30 | - add -fno-omit-frame-pointer to CXXFLAGS if you need to record call graphs 31 | 32 | 33 | catkin config --append-args --cmake-args -DCMAKE_CXX_FLAGS="-fno-omit-frame-pointer" 34 | 35 | if you already have -DCMAKE_CXX_FLAGS defined use the command bellow to remove existing configuration (and add the existing flags to the command above) 36 | 37 | catkin config --remove-args -DCMAKE_CXX_FLAGS="..." 38 | 39 | ## light profiling 40 | 41 | launch-prefix="perf record --verbose --output=perf.out.node_name.data --" 42 | 43 | ## profiling with call stack calls 44 | 45 | launch-prefix="perf record -g --output=perf.out.node_name.data --" 46 | 47 | ## profiling with detailed call stack calls 48 | 49 | launch-prefix="perf record -g --call-graph dwarf --output=perf.out.node_name.data --" 50 | 51 | ## verbose profiling 52 | 53 | launch-prefix="perf record --verbose -g --call-graph dwarf --output=perf.out.node_name.data --" 54 | 55 | ## setup required if used with --all-cpus flag (system wide profiling) 56 | 57 | sudo su 58 | echo 0 > /proc/sys/kernel/kptr_restrict 59 | echo -1 > /proc/sys/kernel/perf_event_paranoid 60 | 61 | 62 | -------------------------- 63 | # Analyse profile results 64 | 65 | ## For light profiling 66 | 67 | perf report --show-nr-samples --verbose --input=perf.out.node_name.data 68 | 69 | ## With call graph 70 | perf report --show-nr-samples --verbose --show-total-period -g 'graph,0.5,callee' --input=perf.out.node_name.data 71 | perf report --show-nr-samples --verbose --show-total-period -g 'fractal,0.5,callee' --input=perf.out.node_name.data 72 | 73 | ## For CSV output 74 | perf report --show-nr-samples --verbose --field-separator=, --show-total-period --show-info --group --demangle --stdio --input=perf.out.node_name.data > perf.out.node_name.data.csv 75 | 76 | ## Source code with profilling info 77 | perf annotate --source --input=perf.out.node_name.data [function/symbol name to annotate] 78 | 79 | ## TUI Shortcuts 80 | 81 | a -> show timers alonside code (annotate) 82 | 83 | 84 | // Attach operf to ROS node 85 | // Output in ~/.ros/ 86 | // Use to see profile results 87 | launch-prefix="operf --callgraph --lazy-conversion" 88 | 89 | -------------------------- 90 | // Analyse profile results 91 | 92 | # Report with call graph 93 | opreport --debug-info --demangle smart --callgraph --global-percent --output-file oprofile_report.txt 94 | 95 | # Source code with profilling info 96 | opannotate --source --demangle smart --output-dir oprofile_annotate 97 | 98 | 99 | // Attach callgrind to ROS node for profilling 100 | // Output file in ~/.ros/ Can be opened with http://kcachegrind.sourceforge.net/html/Home.html 101 | launch-prefix="terminator -mx valgrind --tool=callgrind --callgrind-out-file=callgrind.out.node_name.%p" 102 | 103 | 104 | // Attach massif to ROS node to monitor memory usage 105 | // Output file in ~/.ros/ 106 | launch-prefix="terminator -mx valgrind --tool=massif --heap=yes --stacks=yes --massif-out-file=massif.out.node_name.%p" 107 | 108 | 109 | // Attach memcheck to ROS node to check for memory leaks 110 | // Output file in ~/.ros/ 111 | launch-prefix="terminator -mx valgrind --tool=memcheck --leak-check=full --show-reachable=yes -v --track-origins=yes --log-file=memcheck.out.node_name.%p" 112 | 113 | 114 | 115 | ----------------------------------------------------------------------------------------------------------------------------------------------------- 116 | // To execute the nodes in a different window, prepend terminator -mx to the launch prefixes commands 117 | // Example: 118 | // Attach gdb to ROS node in a different console window 119 | launch-prefix="terminator -mx gdb -ex run --args" 120 | 121 | // Run ROS node in different window to isolate its output from the other nodes 122 | launch-prefix="terminator -mx" 123 | -------------------------------------------------------------------------------- /Figures/notes/valgrind_cachegrind_Kcachegrind.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/valgrind_cachegrind_Kcachegrind.jpeg -------------------------------------------------------------------------------- /Figures/notes/优化前discrete_parallel优化部分.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/优化前discrete_parallel优化部分.jpeg -------------------------------------------------------------------------------- /Figures/notes/优化前discrete_sequential.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/优化前discrete_sequential.jpeg -------------------------------------------------------------------------------- /Figures/notes/分析核心转储文件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/Figures/notes/分析核心转储文件.png -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) Microsoft Corporation. All rights reserved. 2 | 3 | MIT License 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Profiling.md: -------------------------------------------------------------------------------- 1 | # CPU程序Profiling 2 | 3 | 4 | 5 | 6 | ## gperftools分析内存与cpu占用,官方文档 7 | 8 | https://gperftools.github.io/gperftools/cpuprofile.html 9 | 10 | https://github.com/ethz-asl/programming_guidelines/wiki/Profiling-Code 11 | 12 | 个人尝试推荐[使用方法](https://liam.page/2020/06/22/CPU-Profiler-in-gperftools-not-working/),也可参见图片"Figures/notes/gperftools.png" 13 | 具体例如ego_planner_node: 14 | 15 | ```cpp 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | using namespace ego_planner; 22 | 23 | int main(int argc, char **argv) 24 | { 25 | ProfilerStart("/home/ztr/Formation/heap/ego_planner_node.prof"); 26 | HeapProfilerStart("/home/ztr/Formation/heap/ego_planner_node_memory.log"); 27 | ros::init(argc, argv, "ego_planner_node"); 28 | ros::NodeHandle nh("~"); 29 | 30 | EGOReplanFSM rebo_replan; 31 | 32 | rebo_replan.init(nh); 33 | 34 | 35 | ros::spin(); 36 | HeapProfilerStop(); 37 | ProfilerStop(); 38 | return 0; 39 | 40 | //对应CMakeLists.txt多出一些行数如 41 | 42 | target_link_libraries(ego_planner_node 43 | ${catkin_LIBRARIES} 44 | profiler //分析CPU需要, 45 | tcmalloc//分析内存需要 46 | ) 47 | set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-as-needed") #https://stackoverflow.com/questions/24532853/how-can-i-add-linker-flag-for-libraries-with-cmake 48 | 49 | 50 | } 51 | // 最后如下分析 52 | google-pprof --pdf devel/lib/ego_planner/ego_planner_node heap/ego_planner_node.prof > test.pdf 53 | ``` 54 | - [函数调用效果1](Figures/notes/pprof.pdf) 55 | - [函数调用效果2](Figures/notes/pprof2.pdf) 56 | ## 获得所有函数调用的情况 57 | 58 | ### 注意为了显示出全部函数调用的情况,需要在各个link的库中添加头文件,添加代码避免被编译器优化 59 | ```cpp 60 | 61 | #include 62 | 63 | 并且代码当中添加如下 64 | 65 | volatile bool tmp = false; 66 | if (tmp) ProfilerStop(); 67 | CMakeLists.txt中链接profiler如下 68 | target_link_libraries( traj_opt 69 | ${catkin_LIBRARIES} 70 | profiler 71 | ) 72 | ``` 73 | ## 整体类似与NVTX CUDA profiling一样,需要打桩,使用起来不如valgrind方便 74 | 75 | # Cuda程序Profiling 76 | # GPU profiling 77 | - nsys profile -t nvtx,cuda --stats=true -f true -o withouteigen terrain_analyzer 78 | nsight-sys 79 | 80 | [墙裂推荐Nsight System](Doc/nsight.pdf)结合nvtx 81 | ![](Figures/notes/nsys1.png) 82 | ![](Figures/notes/nsys2.png) 83 | 84 | # ROS节点profiling 85 | 86 | ## 墙裂推荐Valgrind & callgrind &cachegrind & 再使用kcachegrind分析相对而言更加好用 87 | - 参见[ros下debug, profiling工具](Figures/notes/profiling_roslaunch_prefix.md) 88 | - 类似可参考[profiling](Figures/notes/profiling1.pdf)与[valgrind_or_gdb](Figures/notes/profiling2.pdf) 89 | ## 使用valgrind注意输出的文件在~/.ros/下,之后用kcachegrind导入 90 | ### kcachegrind callgrind.out.xxx_pid或者kcachegrind cachegrind.out.xxx_pid类似,GUI有时候不能找到文件,命令行打开 91 | 92 | ```cpp 93 | # Callgrind试例 94 | 95 | 96 | 97 | # Cachegrind试例 98 | 99 | 100 | 101 | # 内存泄露分析 102 | 103 | 104 | 105 | 106 | ``` 107 | ## 分析CPU耗时,函数调用占比等 108 | ![profiling实例1](Figures/notes/优化前discrete_parallel优化部分.jpeg) 109 | 110 | ![profiling实例2](Figures/notes/优化前discrete_sequential.jpeg) 111 | ## 分析cachemiss缓存性能 112 | ![profiling实例3](Figures/notes/cachemiss.png) 113 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # 针对Robotics Coding指南 2 | 本仓库收集汇总一些个人觉得常用的关于ROS等相关程序debug,profiling,加速调优等的相关工具链. 3 | # Debug 4 | ## CPU程序Debug 5 | ## 关于逐行运行代码debug 6 | 推荐vscode ros插件,以debug模式编译节点,之后详见 7 | - [ros节点debug,roslaunch运行debug](debug-support.md) 8 | ## Core Dump分析 9 | - [段错误or核心转储or Segmentation Fault](Coredump.md) 10 | ## CUDA程序Debug 11 | 仅仅set(CMAKE_BUILD_TYPE Debug)不够,注意设置-g -G的flag为host与device的调试信息如下,同时安装vscode插件[Nsight Visual Studio Code Edition](https://github.com/NVIDIA/nsight-vscode-edition.git)。支持一个warp为单位逐行bug. 12 | ![thread id注意设置为32的整数倍数](Figures/notes/cudadebug.png) 13 | - [补充参见视频](https://developer.nvidia.com/nsight-visual-studio-code-edition) 14 | - 墙裂推荐nsight-syms组件调优profiling,[视频](https://www.youtube.com/watch?v=kKANP0kL_hk&ab_channel=POPHPC) 15 | 16 | ```cpp 17 | cmake_minimum_required(VERSION 3.10) 18 | 19 | set(CMAKE_CXX_STANDARD 17) 20 | set(CMAKE_BUILD_TYPE Debug) 21 | set(CMAKE_CUDA_ARCHITECTURES 52;70;75;86) 22 | 23 | project(hellocuda LANGUAGES CXX CUDA) 24 | 25 | add_executable(main main.cu) 26 | if(CMAKE_BUILD_TYPE STREQUAL "Debug") 27 | target_compile_options(main PRIVATE $<$:-G -g>) 28 | endif() 29 | target_include_directories(main PUBLIC ../../include) 30 | ``` 31 | 32 | 33 | # HPC(高性能计算) 34 | - 并行加速库推荐OpenMP,在ros中使用个人觉得方便简单,例如典型cpu-bound的进程中for循环加上适当profiling可加速10倍 35 | - 墙裂推荐[并行编程与优化](https://github.com/parallel101/course) 36 | # Profiling (CPU+GPU) 37 | - [程序调优](Profiling.md) 38 | 39 | 40 | # 编译,cmake相关系列 41 | - 参见Doc/cmake项目管理.pdf 42 | - 参见Doc/cmakeadvanced.pdf 43 | - 类似墙裂推荐[并行编程与优化](https://github.com/parallel101/course)cmake相关系列 44 | - 编译期sanity-check 45 | ```make 46 | set(CMAKE_BUILD_TYPE "Release") 47 | ADD_COMPILE_OPTIONS(-std=c++14 ) 48 | set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g") 49 | #!!!!!!!!!!sanity check, compiler flags!!!!!!!!!! 50 | add_compile_options( 51 | -Wall 52 | -Wextra 53 | -Weffc++ 54 | -Werror=uninitialized 55 | -Werror=return-type 56 | -Wconversion 57 | -Werror=unused-result 58 | -Werror=suggest-override 59 | -Wzero-as-null-pointer-constant 60 | -Wmissing-declarations 61 | -Wold-style-cast 62 | -Wnon-virtual-dtor 63 | ) 64 | #!!!!!!!!!!sanity check, com```cpppiler flags!!!!!!!!!! 65 | ``` 66 | 67 | -------------------------------------------------------------------------------- /debug-support.md: -------------------------------------------------------------------------------- 1 | # 推荐[vscode-ros插件](https://github.com/ms-iot/vscode-ros),详见下 2 | 3 | # Debug ROS Nodes 4 | 5 | One of the key goals of `vscode-ros` is to provide a streamlined debugging experience for ROS nodes. 6 | To achieve this, this extension aims to help developers utilize the debugging capabilities provided by Visual Studio Code. 7 | This document covers instructions of how to use such functionalities. 8 | 9 | Read more about the design and related discussions on the debugging functionalities in our [design document][spec_debug_ros_nodes]. 10 | 11 | ## Attach 12 | 13 | `vscode-ros` enables a bootstrapped debugging experience for debugging a ROS (Python or C++) node by attaching to the process. 14 | 15 | To get started, create a `ros`-type debug configuration with an `attach` request: (use Ctrl-Space to bring up the autocomplete dropdown) 16 | 17 | ![create attach debug configuration][create_attach_debug_configuration] 18 | 19 | ### Attaching to a Python node 20 | 21 | ![attach to a python node][attach_to_python] 22 | 23 | ### Attaching to a C++ node 24 | 25 | ![attach to a cpp node][attach_to_cpp] 26 | 27 | ## Launch 28 | 29 | `vscode-ros` enables a streamlined debugging experience for debugging a ROS (Python or C++) node in a ROS launch file similar to a native debug flow. 30 | 31 | To get started, create a `ros`-type debug configuration with a `launch` request: 32 | 33 | ![create launch debug configuration][create_launch_debug_configuration] 34 | 35 | ### Prerequisite 36 | 37 | There needs to be a running instance of `rosmaster`. 38 | The launch-debug flow provided by `vscode-ros` will not spawn a `rosmaster`. 39 | 40 | ![check roscore status][check_roscore_status] 41 | 42 | ### Launch and debug Python and C++ nodes 43 | 44 | ![launch and debug Python and C++ nodes][launch_and_debug_nodes] 45 | 46 | ### Use tasks to automatically build before starting debug session 47 | 48 | The first thing you need to do is to create build task for your package(s) with enabled debug symbols. 49 | In the example below you can see a `catkin_make` build task that passes additional `-DCMAKE_BUILD_TYPE=Debug` argument that switches build to use `Debug` configuration, which is the most suitable configuration for debugging, because it has 0 optimization level and includes debug symbols. Another option is to use `-DCMAKE_BUILD_TYPE=RelWithDebInfo` that also enables debug symbols, but uses `Release` settings for everything else and has optimizations enabled. `RelWithDebInfo` might be a go to build configuration for Windows users in order to avoid slowness of the debug CRT on Windows OS. You can read more about [CMAKE_BUILD_TYPE here][stackoverflow-cmake_build_type] 50 | 51 | **Note: you might need to remove the old `build` folder to force rebuild in new configuraiton.** 52 | 53 | ```json5 54 | { 55 | "version": "2.0.0", 56 | "tasks": [ 57 | { 58 | "label": "make_debug", 59 | "type": "catkin_make", 60 | "args": [ 61 | "--directory", 62 | "${workspaceFolder}", 63 | "-DCMAKE_BUILD_TYPE=Debug", // This extra argument enables built with debug symbols 64 | ], 65 | "problemMatcher": [ 66 | "$catkin-gcc" 67 | ], 68 | "group": { 69 | "kind": "build", 70 | "isDefault": true 71 | }, 72 | }, 73 | ] 74 | } 75 | ``` 76 | 77 | The next step would be to configure `.vscode/launch.json` and customize `preLaunchTask` to use `make_debug` task we created above. 78 | 79 | ```json5 80 | { 81 | "version": "0.2.0", 82 | "configurations": [ 83 | { 84 | "name": "ROS: Launch", 85 | "type": "ros", 86 | "request": "launch", 87 | "target": "${workspaceFolder}/launch/some.launch", // <<< Configure path to your launch file 88 | "preLaunchTask": "make_debug", // <<< This is the task that will run before debugging starts 89 | } 90 | ] 91 | } 92 | 93 | ``` 94 | 95 | 96 | 97 | 98 | ### Use tasks to automatically build and start rosmaster 99 | 100 | **This is current BLOCKED BY VSCode Bug [70283][ms-vscode.background_bug]. This bug will prevent the second debugging session from starting if roscore background task is already running** 101 | 102 | This section continues setup that was described [above](#build_tasks), so please complete that section and ensure you can build and debug with manually started roscore 103 | 104 | We are going to define a new task named `make_debug_and_core` that is going to start both `make_debug` and `roscore: roscore` tasks. `roscore: roscore` is a background task that will continue running even after debuging session is over 105 | 106 | ```json5 107 | { 108 | "version": "2.0.0", 109 | "tasks": [ 110 | /// ... `make_debug` task definition as before 111 | { 112 | "label": "make_debug_and_core", 113 | "dependsOn": [ 114 | "make_debug", 115 | "roscore: roscore", // This task is provided by vscode-ros 116 | ] 117 | }, 118 | ] 119 | } 120 | ``` 121 | 122 | The next step would be to switch `preLaunchTask` to use `make_debug_and_core` task we created above. 123 | 124 | ```json5 125 | { 126 | "version": "0.2.0", 127 | "configurations": [ 128 | { 129 | // ... same as before 130 | "preLaunchTask": "make_debug_and_core", 131 | } 132 | ] 133 | } 134 | 135 | ``` 136 | 137 | ## Note 138 | 139 | 1. Debugging functionality provided by `vscode-ros` has dependencies on VS Code’s [C++][ms-vscode.cpptools] and [Python][ms-python.python] extensions, and those have dependencies on the version of VS Code. To ensure everything works as expected, please make sure to have everything up-to-date. 140 | 2. To debug a C++ executable, please make sure the binary is [built with debug symbols][ros_answers_debug_symbol] (e.g. `-DCMAKE_BUILD_TYPE=RelWithDebInfo`, read more about [CMAKE_BUILD_TYPE here][stackoverflow-cmake_build_type]). 141 | 3. To use VS Code's C++ extension with MSVC on Windows, please make sure the VS Code instance is launched from a Visual Studio command prompt. 142 | 143 | 144 | [create_attach_debug_configuration]: media/documentation/debug-support/create-attach-debug-config.gif 145 | [attach_to_cpp]: media/documentation/debug-support/attach-to-cpp.gif 146 | [attach_to_python]: media/documentation/debug-support/attach-to-python.gif 147 | [create_launch_debug_configuration]: media/documentation/debug-support/create-launch-debug-config.gif 148 | [check_roscore_status]: media/documentation/debug-support/check-roscore-status.gif 149 | [launch_and_debug_nodes]: media/documentation/debug-support/launch-and-debug-nodes.gif 150 | 151 | [spec_debug_ros_nodes]: ./spec/debug-ros-nodes.md 152 | 153 | 154 | [ros_answers_debug_symbol]: https://answers.ros.org/question/200155/how-to-debug-executable-built-with-catkin_make-without-roslaunch/ 155 | 156 | [ms-python.python]: https://marketplace.visualstudio.com/items?itemName=ms-python.python 157 | [ms-vscode.cpptools]: https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools 158 | [ms-vscode.background_bug]: https://github.com/microsoft/vscode/issues/70283 159 | [stackoverflow-cmake_build_type]: https://stackoverflow.com/a/59314670/888545 160 | 161 | ## [补充参见](https://answers.ros.org/question/313371/vscode-debug-cpp-ros-node/) -------------------------------------------------------------------------------- /media/documentation/Coredump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/Coredump.png -------------------------------------------------------------------------------- /media/documentation/debug-support/attach-to-cpp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/debug-support/attach-to-cpp.gif -------------------------------------------------------------------------------- /media/documentation/debug-support/attach-to-python.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/debug-support/attach-to-python.gif -------------------------------------------------------------------------------- /media/documentation/debug-support/check-roscore-status.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/debug-support/check-roscore-status.gif -------------------------------------------------------------------------------- /media/documentation/debug-support/create-attach-debug-config.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/debug-support/create-attach-debug-config.gif -------------------------------------------------------------------------------- /media/documentation/debug-support/create-launch-debug-config.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/debug-support/create-launch-debug-config.gif -------------------------------------------------------------------------------- /media/documentation/debug-support/launch-and-debug-nodes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/debug-support/launch-and-debug-nodes.gif -------------------------------------------------------------------------------- /media/documentation/debug-support/ros2-launch-debug.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/debug-support/ros2-launch-debug.gif -------------------------------------------------------------------------------- /media/documentation/download-vsix-artifact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/download-vsix-artifact.png -------------------------------------------------------------------------------- /media/documentation/draft-release.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/draft-release.png -------------------------------------------------------------------------------- /media/documentation/git-fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/git-fork.png -------------------------------------------------------------------------------- /media/documentation/pipeline-manual-release.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/pipeline-manual-release.png -------------------------------------------------------------------------------- /media/documentation/spec/debug-ros-nodes/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/spec/debug-ros-nodes/architecture.png -------------------------------------------------------------------------------- /media/documentation/spec/debug-ros-nodes/attach-debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/spec/debug-ros-nodes/attach-debug.png -------------------------------------------------------------------------------- /media/documentation/spec/debug-ros-nodes/debug-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/spec/debug-ros-nodes/debug-flow.png -------------------------------------------------------------------------------- /media/documentation/spec/debug-ros-nodes/execute-a-debug-configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/spec/debug-ros-nodes/execute-a-debug-configuration.png -------------------------------------------------------------------------------- /media/documentation/spec/debug-ros-nodes/launch-debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/documentation/spec/debug-ros-nodes/launch-debug.png -------------------------------------------------------------------------------- /media/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pupillen/Robotics_Coding/25e8645b3e0705b289da5a10546f529b3022e248/media/icon.png --------------------------------------------------------------------------------