{"id":1140,"date":"2026-09-09T13:04:29","date_gmt":"2026-09-09T20:04:29","guid":{"rendered":"https:\/\/sysprogs.com\/tutorials\/?p=1140"},"modified":"2026-09-09T13:06:28","modified_gmt":"2026-09-09T20:06:28","slug":"developing-esp32-projects-on-linux-with-codevroom","status":"publish","type":"post","link":"https:\/\/sysprogs.com\/CodeVROOM\/tutorials\/esp32\/","title":{"rendered":"Developing ESP32 Projects on Linux with CodeVROOM"},"content":{"rendered":"<p>This tutorial shows how to create, build and debug a basic ESP32 project on Linux using CodeVROOM (a cross-platform port of VisualGDB). Same steps will also work if you are using Windows or MacOS.<\/p>\n<p>Before you begin, download the latest version of CodeVROOM <a href=\"https:\/\/sysprogs.com\/CodeVROOM\/download\/\">here<\/a>. You can then either install it, or run directly in the portable mode.<\/p>\n<ol>\n<li>Start CodeVROOM and select <strong>File-&gt;New-&gt;Project<\/strong> to begin creating a project:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/01-started.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1141\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/01-started.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/01-started.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/01-started-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/01-started-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/01-started-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<li>Pick the ESP32 project wizard:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/02-newprj.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1142\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/02-newprj.png\" alt=\"\" width=\"810\" height=\"425\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/02-newprj.png 810w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/02-newprj-300x157.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/02-newprj-768x403.png 768w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/02-newprj-390x205.png 390w\" sizes=\"(max-width: 810px) 100vw, 810px\" \/><\/a><\/li>\n<li>The first wizard page allows selecting the toolchain and ESP-IDF version. CodeVROOM can reuse the ESP-IDF installations from the Espressif&#8217;s VS Code extension, but it can also install the tools from scratch. Click &#8220;Clone an SDK release from Github&#8221; to install a new SDK:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/03-get.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1143\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/03-get.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/03-get.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/03-get-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/03-get-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/03-get-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<li>Select the ESP-IDF version you would like to use and click &#8220;OK&#8221;:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/04-ver.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1144\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/04-ver.png\" alt=\"\" width=\"800\" height=\"637\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/04-ver.png 800w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/04-ver-300x239.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/04-ver-768x612.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/li>\n<li>CodeVROOM will automatically clone the SDK and download the necessary tool dependencies:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/05-progress.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1145\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/05-progress.png\" alt=\"\" width=\"508\" height=\"257\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/05-progress.png 508w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/05-progress-300x152.png 300w\" sizes=\"(max-width: 508px) 100vw, 508px\" \/><\/a><\/li>\n<li>Once the installation is completed, the ESP-IDF checkout will appear in the selector. Make sure you have selected the correct device and click &#8220;Next&#8221;:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/06-ver.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1146\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/06-ver.png\" alt=\"\" width=\"870\" height=\"728\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/06-ver.png 870w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/06-ver-300x251.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/06-ver-768x643.png 768w\" sizes=\"(max-width: 870px) 100vw, 870px\" \/><\/a><\/li>\n<li>Select the sample project you would like to clone:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/07-blink.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1147\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/07-blink.png\" alt=\"\" width=\"870\" height=\"728\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/07-blink.png 870w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/07-blink-300x251.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/07-blink-768x643.png 768w\" sizes=\"(max-width: 870px) 100vw, 870px\" \/><\/a><\/li>\n<li>The final page of the wizard allows configuring the debug settings. It automatically shows the OpenOCD scripts for the target and interface, and allows quickly running OpenOCD to test the configuration:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/08-debug.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1148\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/08-debug.png\" alt=\"\" width=\"870\" height=\"728\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/08-debug.png 870w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/08-debug-300x251.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/08-debug-768x643.png 768w\" sizes=\"(max-width: 870px) 100vw, 870px\" \/><\/a><\/li>\n<li>Click &#8220;Test&#8221; to ensure that OpenOCD can connect to the board:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/09-tested.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1149\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/09-tested.png\" alt=\"\" width=\"800\" height=\"628\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/09-tested.png 800w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/09-tested-300x236.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/09-tested-768x603.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/li>\n<li>Press &#8220;Finish&#8221; to create the project. Once it is loaded, you will see a project layout similar to VisualGDB:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/10-configured.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1150\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/10-configured.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/10-configured.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/10-configured-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/10-configured-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/10-configured-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<li>Build the project. ESP-IDF projects involve many small files, so the build on Linux generally takes much less time compared to Windows:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/11-built.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1151\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/11-built.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/11-built.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/11-built-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/11-built-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/11-built-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<li>Set a breakpoint in <strong>app_main()<\/strong> and use the toolbar or the keyboard shortcut to start debugging. CodeVROOM will automatically program the FLASH memory using the Espressif&#8217;s OpenOCD fork:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/12-program.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1152\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/12-program.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/12-program.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/12-program-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/12-program-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/12-program-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<li>Once the program is loaded, the breakpoint will hit. You can use the Stack Frames window to see what function called <strong>app_main()<\/strong>:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/13-stopped.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1153\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/13-stopped.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/13-stopped.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/13-stopped-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/13-stopped-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/13-stopped-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<li>Use the <strong>Debug-&gt;Windows-&gt;Threads<\/strong> window to view all threads, and their stack frames. Note that if you stop the program at an arbitrary point, CodeVROOM will highlight the locations of all threads in code. You can then click the link next to each highlighted line to switch to that thread and view its local variables:<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/14-threads.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1154\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/14-threads.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/14-threads.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/14-threads-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/14-threads-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/14-threads-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<li>You can hover the mouse over various variables in the code, or use the Watch windows to observe them. Use the context menu to quickly jump to additional debugging windows (e.g. memory):<a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/15-watch.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1155\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/15-watch.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/15-watch.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/15-watch-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/15-watch-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/15-watch-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<li>Similarly to VisualGDB, you can edit various project properties via the Properties command in the Files window. E.g. the ESP-IDF configuration variables will be shown as a searchable tree: <a href=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/16-properties.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1156\" src=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/16-properties.png\" alt=\"\" width=\"1366\" height=\"768\" srcset=\"https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/16-properties.png 1366w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/16-properties-300x169.png 300w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/16-properties-1024x576.png 1024w, https:\/\/sysprogs.com\/tutorials\/wp-content\/uploads\/2026\/09\/16-properties-768x432.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial shows how to create, build and debug a basic ESP32 project on Linux using CodeVROOM (a cross-platform port<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[64],"tags":[],"_links":{"self":[{"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/posts\/1140"}],"collection":[{"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/comments?post=1140"}],"version-history":[{"count":2,"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/posts\/1140\/revisions"}],"predecessor-version":[{"id":1160,"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/posts\/1140\/revisions\/1160"}],"wp:attachment":[{"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sysprogs.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}