{"id":6715,"date":"2022-05-11T10:36:04","date_gmt":"2022-05-11T09:36:04","guid":{"rendered":"https:\/\/medtech-ingenieur.de\/?p=6715"},"modified":"2022-05-30T09:51:57","modified_gmt":"2022-05-30T08:51:57","slug":"howto-debug-ceedling-unit-tests","status":"publish","type":"post","link":"https:\/\/medtech-ingenieur.de\/en\/howto-debug-ceedling-unit-tests\/","title":{"rendered":"Howto debug Ceedling unit tests"},"content":{"rendered":"<h2>Hintergrund<\/h2>\n<p><a href=\"http:\/\/www.throwtheswitch.org\/ceedling\">Ceedling<\/a> ist ein (zu Recht) weit verbreitetes und in <a href=\"https:\/\/www.ruby-lang.org\/de\/\">Ruby<\/a> entwickeltes Build-System f\u00fcr C-Projekte.\u00a0\u00a0 Zusammen mit <a href=\"https:\/\/github.com\/ThrowTheSwitch\/CMock\/blob\/master\/docs\/CMock_Summary.md\">Unity und CMock<\/a> wird es in der Embedded Software-Entwicklung gerne eingesetzt. Nach einer gewissen Einarbeitungszeit sind <a href=\"http:\/\/www.throwtheswitch.org\/cmock\">Unit-Tests<\/a> normalerweise recht z\u00fcgig erstellt. Idealerweise erstellt man die Tests zusammen mit der eigentlichen Implementierung. (Auf Test-Driven-Development will ich hier allerdings nicht n\u00e4her eingehen.)<\/p>\n<p>Es passiert allerdings immer wieder mal, dass ein Test &#8222;abraucht&#8220; &#8211; sprich: sich sang- und klanglos wegen einer Exception verabschiedet.<\/p>\n<p><!--more-->Hier ein Beispiel einer solchen wenig hilfreichen Fehlermeldung:<\/p>\n<blockquote><p>Linking test_adcCtrl.out&#8230;<br \/>\nRunning test_adcCtrl.out&#8230;<\/p>\n<p>ERROR: Test executable &#8222;test_adcCtrl.out&#8220; failed.<br \/>\n&gt; Produced no output to $stdout.<br \/>\n&gt; And exited with status: [0] (count of failed tests).<br \/>\n&gt; This is often a symptom of a bad memory access in source or test code.<\/p>\n<p>rake aborted!<\/p>\n<p>C:\/testprj\/tools\/vendor\/ceedling\/lib\/ceedling\/generator_helper.rb:36:in `test_results_error_handler&#8216;<br \/>\nC:\/testprj\/tools\/vendor\/ceedling\/lib\/ceedling\/generator.rb:173:in `generate_test_results&#8216;<br \/>\nC:\/testprj\/tools\/vendor\/ceedling\/lib\/ceedling\/rules_tests.rake:55:in `block in &lt;top (required)&gt;&#8216;<br \/>\nC:\/testprj\/tools\/vendor\/ceedling\/lib\/ceedling\/task_invoker.rb:107:in `invoke_test_results&#8216;<br \/>\nC:\/testprj\/tools\/vendor\/ceedling\/lib\/ceedling\/test_invoker.rb:124:in `block in setup_and_invoke&#8216;<br \/>\nC:\/testprj\/tools\/vendor\/ceedling\/lib\/ceedling\/test_invoker.rb:51:in `each&#8216;<br \/>\nC:\/testprj\/tools\/vendor\/ceedling\/lib\/ceedling\/test_invoker.rb:51:in `setup_and_invoke&#8216;<br \/>\nC:\/testprj\/tools\/vendor\/ceedling\/lib\/ceedling\/rules_tests.rake:70:in `block (2 levels) in &lt;top (required)&gt;&#8216;<br \/>\n..\/..\/tools\/vendor\/ceedling\/bin\/ceedling:346:in `block in &lt;main&gt;&#8216;<br \/>\n..\/..\/tools\/vendor\/ceedling\/bin\/ceedling:333:in `&lt;main&gt;&#8216;<br \/>\nTasks: TOP =&gt; build\/test\/results\/test_adcCtrl.pass<br \/>\n(See full trace by running task with &#8211;trace)<\/p><\/blockquote>\n<p>Ursache sind z.B. Aufrufe von SDK-Funktionen, die auf Hardware-Adressen zugreifen und die es in der Simulation nat\u00fcrlich nicht gibt. In solchen F\u00e4llen die Fehlerursache zu finden, kann ohne weitere Analysem\u00f6glichkeiten auf l\u00e4ngliches printf-Debugging hinauslaufen. Sch\u00f6n ist anders!<\/p>\n<p><strong>Hinweis:<\/strong> Im Folgenden gehe ich davon aus, dass bereits Unittests (unter Windows) mit Ceedling laufen; f\u00fcr das Einrichten von Ceedling gibt es gute Anleitungen ;-)<\/p>\n<p>Wir verwenden in verschiedenen Projekten <em>Ruby<\/em> mit <em>DevTools<\/em> (Ruby-Installation <a href=\"https:\/\/rubyinstaller.org\/downloads\/\">https:\/\/rubyinstaller.org\/downloads\/<\/a>, z.B. rubyinstaller-devkit-2.7.5-1-x86.exe). Der Compiler <em>gcc<\/em> kommt mit den MSYS2-Tools (<a href=\"https:\/\/www.msys2.org\/\">https:\/\/www.msys2.org\/<\/a>) und ist da schon inklusive.<\/p>\n<h2>Back to the roots: gdb<\/h2>\n<p>Es ist schon seeehr lange her, dass ich den GNU Debugger <em>gdb<\/em> direkt verwendet habe. Zum Applikations-Debugging verwendet man normalerweise eine IDE (Segger\/CubeIDE) oder ein anderes graphisches Debugger-Frontend (xgdb, DDD, KDbg,\u2026) um sich das Leben nicht unn\u00f6tig zu erschweren.<\/p>\n<p>Wer Cygwin verwendet, hat den gdb normalerweise schon installiert. Wer Ruby mit MSYS2 verwendet, muss den gdb als optionales Packet installieren. Tipps dazu finden Sie am Ende (\u201eMSYS2 gdb-Installation\u201c).<\/p>\n<p>Die old-school-Version, um die Absturzursache eines Tests zu finden ist<\/p>\n<ul>\n<li>eine Konsole (cmd) \u00f6ffnen und den gdb mit dem absoluten Pfad zum Test-Executable starten:<br \/>\n<blockquote><p>C:\\testprj\\scripts&gt;gdb C:\\testprj\\Unittest\\build\\test\\out\\test_adcCtrl.out<\/p><\/blockquote>\n<\/li>\n<li>gdb l\u00e4dt das Executable und liest die darin enthaltene Symbolinformation:<br \/>\n<blockquote><p>Reading symbols from C:\\testprj\\Unittest\\build\\test\\out\\test_adcCtrl.out&#8230;<br \/>\n(gdb)<\/p><\/blockquote>\n<\/li>\n<li>Mit \u201crun\u201d (oder kurz \u201cr\u201c) starten man das Executable:<br \/>\n<blockquote><p>(gdb) rStarting program: C:\\tesprj\\Unittest\\build\\test\\out\\test_adcCtrl.out<br \/>\n[New Thread 29368.0x700c]<\/p>\n<p>Thread 1 received signal SIGSEGV, Segmentation fault.<br \/>\ntest_adcCtrl_daqComplete () at test\/test_adcCtrl.c:68<br \/>\n68 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 adc_handler.Instance-&gt;CR = 0xFF;(gdb)<\/p><\/blockquote>\n<\/li>\n<li>Falls man\u2019s noch etwas genauer haben m\u00f6chten \u2013 den Stacktrace erh\u00e4lt man mittels \u201ewhere\u201c:<br \/>\n<blockquote><p>(gdb) where<br \/>\n#0 test_adcCtrl_daqComplete () at test\/test_adcCtrl.c:68<br \/>\n#1\u00a0 0x00f816f0 in run_test (func=0xf818b4 &lt;test_adcCtrl_daqComplete&gt;, name=0xfc8053 &#8222;test_adcCtrl_daqComplete&#8220;, line_num=57) at build\/test\/runners\/test_adcCtrl_runner.c:93<br \/>\n#2\u00a0 0x00f81755 in main () at build\/test\/runners\/test_adcCtrl_runner.c:109(gdb)<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p>Mit diesen Informationen kommt man zumeist schon sehr viel weiter. (In diesem konkreten Fall greift der Applikationscode auf einen Pointer in der Datenstruktur <em>ADC_HandleTypeDef<\/em> \u00a0zu \u2013 und der ist NULL).<\/p>\n<h2>Etwas mehr Komfort bitte<\/h2>\n<p>Hardcore-gdb-ing ist ok \u2013 aber im Alter mag man\u2019s gern auch etwas bequemer. Als gelegentlich VS Code-Nutzer lag die Suche nach einem Plug-In nahe, welches den Ceedling Unit-Tests Workflow unterst\u00fctzt. Dabei bin auf \u00fcber mehrere Blog-Beitr\u00e4ge etc. gesto\u00dfen. Am Ende des Artikels finden Sie eine Liste der verwendeten Quellen. Die Quintessenz ist in diesem Artikel zusammengefasst.<\/p>\n<p>Jetzt geht&#8217;s also um die Zutaten die&#8217;s braucht, um einen Testcase zu Debuggen &#8211; und das m\u00f6glichst komfortabel.<\/p>\n<h2>VS Code &#8211; mehr als ein Editor<\/h2>\n<p>VS Code ist ein Open-Source-Projekt (MIT-Lizenz) und wird manchmal auch nur als Editor verwendet. Damit bleibt man aber weit unter seinen M\u00f6glichkeiten. Mit den zahlreichen Erweiterungen wird er schnell zur eierlegenden Wollmilchsau \u2013 und dem diesem Fall zur \u201eCeedling-IDE\u201c :-)<\/p>\n<h2>Installation<\/h2>\n<p>Folgende Tools sind erforderlich<\/p>\n<ol>\n<li>VS Code (<a href=\"https:\/\/code.visualstudio.com\/download\">https:\/\/code.visualstudio.com\/download<\/a> &#8211; ich verwende die 64bit Version)<\/li>\n<li>Die VS Code-Erweiterungen\n<ul>\n<li><em>Ceedling Test Explorer<\/em>: Startet Ceedling und die generierten Test-Runner im Hintergrund, parst deren Ausgaben, listet die Testcases, \u2026<\/li>\n<li><em>C\/C++<\/em> : Notwendig zum Debuggen (setzen von Breakpoints, Single stepping, etc.)<br \/>\nAm Ende des Blogs finden Sie eine Liste der installierten Plug-Ins.<\/li>\n<\/ul>\n<\/li>\n<li><em>gdb<\/em> \u2013 der GNU-Debugger. Wie anfangs erw\u00e4hnt, ist er in einer Cygwin-Toolchain \u00fcblicherweise enthalten. Verwendet man MSYS, wird&#8217;s unter Umst\u00e4nden knifflig. Dazu finden Sie Am Ende noch zwei Links, mit Hilfe dere ich den gdb installieren konnte.<\/li>\n<\/ol>\n<p>Die Installation sollte keine Schwierigkeit darstellen. Falls doch &#8211; bitte melden.<\/p>\n<h2>Bringing everything together<\/h2>\n<ol>\n<li>Zun\u00e4chst \u00f6ffnet man in VC Code das Verzeichnis, in dem sich das project.yaml befindet: File -&gt; Open Folder oder in der \u201eExplorer View\u201c<\/li>\n<li>F\u00fcr diesen &#8222;Workspace&#8220; muss zun\u00e4chst eine &#8222;launch&#8220;-Konfiguration erstellt werden.<br \/>\nDazu wechseln Sie in die &#8222;<em>Run View<\/em>&#8222;: Auf der &#8222;<em>Activity Bar<\/em>&#8220; (am linken Fensterrand) klicken Sie auf das Run-Icon \u00a0(Dreieck mit K\u00e4fer). Nun klicken Sie auf &#8222;<em>create a launch.json file<\/em>&#8222;.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6717 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector.png\" alt=\"\" width=\"605\" height=\"390\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector.png 605w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector-300x193.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector-100x64.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector-150x97.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector-200x129.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector-450x290.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector-600x387.png 600w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><br \/>\nJetzt erscheint eine Auswahlliste mit verschiedenen Konfigurationsm\u00f6glichkeiten. Sie k\u00f6nnen irgendeine Option ausw\u00e4hlen. Es spielt keine Rolle, denn den Inhalt der im Verzeichnis <em>.vscode<\/em> erzeugten Datei ersetzen wir mit dem folgenden.<\/li>\n<li>Den folgenden Text \u2013 die sogenannte <em>Launch-Konfiguration<\/em> &#8211; kopieren Sie in die ge\u00f6ffnete launch.json-Datei:\n<pre><code>\r\n{\r\n    \"version\": \"0.2.0\",\r\n    \"configurations\": [\r\n \r\n        {\r\n            \"name\": \"ceedlingExplorer\",\r\n            \"type\": \"cppdbg\",\r\n            \"request\": \"launch\",\r\n            \"program\": \"${workspaceFolder}\/build\/test\/out\/${command:ceedlingExplorer.debugTestExecutable}\",\r\n            \"args\": [],\r\n            \"stopAtEntry\": false,\r\n            \"cwd\": \"${workspaceFolder}\",\r\n            \"environment\": [],\r\n            \"externalConsole\": false,\r\n            \"MIMode\": \"gdb\",\r\n            \"miDebuggerPath\": \"gdb.exe\",\r\n            \"setupCommands\": [\r\n                {\r\n                    \"description\": \"Enable pretty-printing for gdb\",\r\n                    \"text\": \"-enable-pretty-printing\",\r\n                    \"ignoreFailures\": true\r\n                }\r\n            ],\r\n            \"debugConfiguration\": {\r\n                \"description\": \"Debug configuration to run during test debug.\",\r\n                \"type\": \"string\",\r\n                \"scope\": \"resource\"\r\n              },\r\n            \"problemMatching\": {\r\n                \"mode\": \"gcc\"\r\n            }\r\n        }\r\n    ]\r\n}<\/code><\/pre>\n<p>Mit der Konfiguration teilt man dem <em>Ceedling Test Explorer<\/em> mit<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>wo die Test-Sourcen liegen.<br \/>\nDen Pfad \u201ebuild\/test\/out\u201c im Eintrag &#8222;program&#8220; m\u00fcssen Sie ggf. an Ihre Ceedling-Konfiguration (siehe project.yml) angleichen.<\/li>\n<li>welcher Debugger verwendet werden soll.<br \/>\nHief\u00fcr m\u00fcssen Sie den Parameter f\u00fcr miDebuggerPath an Ihre Buildumgebung anpassen. Ist gdb.exe nicht im Suchpfad, k\u00f6nnen Sie hier auch einen absoluten Pfad angeben, z.B.:<br \/>\n&#8222;miDebuggerPath&#8220;: &#8222;<strong>C:\/Ruby27\/msys32\/mingw32\/bin\/<\/strong><strong>gdb.exe<\/strong>&#8222;,<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Die weiteren Parameter muss man normalerweise nicht anfassen.<\/li>\n<li>In den <em>VS Code<\/em>-Settings (via File-&gt;Preferences-&gt;Settings) unter &#8222;Extensions &gt; Ceedling Test Explorer configuration&#8220; muss der Name der Konfiguration, wie im Launch.json angegeben, eingetragen werden:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6718 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Ceedling-Options.png\" alt=\"\" width=\"605\" height=\"547\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Ceedling-Options.png 605w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Ceedling-Options-300x271.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Ceedling-Options-100x90.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Ceedling-Options-150x136.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Ceedling-Options-200x181.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Ceedling-Options-450x407.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Ceedling-Options-600x542.png 600w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/li>\n<li>Damit der Ceedling-Test-Explorer die Testausgaben parsen kann, muss in der Projekt-Datei project.yml noch das Plug-In &#8222;xml_test_report&#8220; erg\u00e4nzt werden:<code><code><\/code><\/code>:plugins:<\/li>\n<\/ol>\n<pre><code>    :load_paths:\r\n      - ..\/..\/tools\/vendor\/ceedling\/plugins\r\n    :enabled:\r\n      - stdout_pretty_tests_report\r\n      - xml_tests_report\r\n<\/code><\/pre>\n<ol>\n<li>Nun noch in die &#8222;Test&#8220;-Ansicht wechseln, auf &#8222;Refresh&#8220; klicken (zweites Icon neben &#8222;TESTING&#8220;) &#8211; und voila :-)<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6721 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_TestView.png\" alt=\"\" width=\"519\" height=\"426\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_TestView.png 519w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_TestView-300x246.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_TestView-100x82.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_TestView-150x123.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_TestView-200x164.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_TestView-450x369.png 450w\" sizes=\"auto, (max-width: 519px) 100vw, 519px\" \/><\/li>\n<\/ol>\n<p>Danach werden alle Testcases aufgelistet.<\/p>\n<p>Nun k\u00f6nnen Sie wie in jeder anderen IDE auch den Test editieren, Tests starten, Breakpoints setzen und debuggen. Was will man mehr!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6722 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_DebugTest.png\" alt=\"\" width=\"440\" height=\"385\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_DebugTest.png 440w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_DebugTest-300x263.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_DebugTest-100x88.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_DebugTest-150x131.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_DebugTest-200x175.png 200w\" sizes=\"auto, (max-width: 440px) 100vw, 440px\" \/><\/p>\n<p>Eine Einschr\u00e4nkung gibt es derzeit noch: Man kann einzelne Test-Cases eines Unit-Tests (noch?) nicht separat ausf\u00fchren oder debuggen. Wollen Sie also einen Test-Case debuggen, m\u00fcssen Sie dort zuerst einen Breakpoint setzen und dann den Bug-Button \u00a0klicken (\u201eDebug this test\u201c).<\/p>\n<p>Sollten Sie Fragen oder Anregungen haben, schreiben Sie einen Kommentar. Ich helfe ihnen gerne weiter.<\/p>\n<h2>Referenzen<\/h2>\n<h3>MSYS2 gdb-Installation:<\/h3>\n<ul>\n<li>GDB installieren: Eine \u00e4ltere Ruby\/MSYS2-Installation hatte sich energisch geweigert, ein Paket zu installieren. Mit Ruby27+MSYS2 war das kein Problem. Einfach die MSYS32-Console starten (in meinem Fall <em>msys2.exe<\/em> im Verzeichnis <em>C:\\Ruby27\\msys32<\/em>) und mittels <em>pacman -S gdb<\/em> wird <em>gdb<\/em> installiert.<br \/>\nHier eine weitere Anleitung: <a href=\"https:\/\/gist.github.com\/bd2357\/b2d69ab18849c1e2f70959eef426ff09\">https:\/\/gist.github.com\/bd2357\/b2d69ab18849c1e2f70959eef426ff09<\/a><u><br \/>\n<\/u>Hinweis: Sie k\u00f6nnen problemlos die 64Bit-Version von gdb installieren (<em>mingw64\/mingw-w64-x86_64-gdb<\/em>), wie in der Anleitung beschrieben, auch wenn Sie die 32-Bit-Version von Ruby\/MSYS2 verwenden.<\/li>\n<li>Probleme mit Signaturen: <a href=\"https:\/\/github.com\/msys2\/MSYS2-packages\/issues\/2343\">https:\/\/github.com\/msys2\/MSYS2-packages\/issues\/2343<\/a><\/li>\n<\/ul>\n<h3>Links:<\/h3>\n<ul>\n<li>gdb f\u00fcr MSYS installieren: <a href=\"https:\/\/gist.github.com\/bd2357\/b2d69ab18849c1e2f70959eef426ff09\">https:\/\/gist.github.com\/bd2357\/b2d69ab18849c1e2f70959eef426ff09<\/a><\/li>\n<\/ul>\n<h3>VS Code-Plugins<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6725 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Plugins.png\" alt=\"\" width=\"554\" height=\"376\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Plugins.png 554w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Plugins-300x204.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Plugins-100x68.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Plugins-150x102.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Plugins-200x136.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_Plugins-450x305.png 450w\" sizes=\"auto, (max-width: 554px) 100vw, 554px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hintergrund Ceedling ist ein (zu Recht) weit verbreitetes und in Ruby entwickeltes Build-System f\u00fcr C-Projekte.\u00a0\u00a0 Zusammen mit Unity und CMock wird es in der Embedded Software-Entwicklung gerne eingesetzt. Nach einer gewissen Einarbeitungszeit sind Unit-Tests normalerweise recht z\u00fcgig erstellt. Idealerweise erstellt man die Tests zusammen mit der eigentlichen Implementierung. (Auf Test-Driven-Development will ich hier allerdings nicht [&hellip;]<\/p>\n","protected":false},"author":31,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,6,468],"tags":[],"class_list":["post-6715","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-software","category-testen","post-wrapper","thrv_wrapper"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Howto debug Ceedling Unit-Tests - MEDtech Ingenieur GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/medtech-ingenieur.de\/en\/howto-debug-ceedling-unit-tests\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Howto debug Ceedling Unit-Tests - MEDtech Ingenieur GmbH\" \/>\n<meta property=\"og:description\" content=\"Hintergrund Ceedling ist ein (zu Recht) weit verbreitetes und in Ruby entwickeltes Build-System f\u00fcr C-Projekte.\u00a0\u00a0 Zusammen mit Unity und CMock wird es in der Embedded Software-Entwicklung gerne eingesetzt. Nach einer gewissen Einarbeitungszeit sind Unit-Tests normalerweise recht z\u00fcgig erstellt. Idealerweise erstellt man die Tests zusammen mit der eigentlichen Implementierung. (Auf Test-Driven-Development will ich hier allerdings nicht [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/medtech-ingenieur.de\/en\/howto-debug-ceedling-unit-tests\/\" \/>\n<meta property=\"og:site_name\" content=\"MEDtech Ingenieur GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/medtechIngenieur\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-11T09:36:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-05-30T08:51:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector.png\" \/>\n<meta name=\"author\" content=\"J\u00fcrgen Welzenbach\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@MedtechIng\" \/>\n<meta name=\"twitter:site\" content=\"@MedtechIng\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"J\u00fcrgen Welzenbach\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/\"},\"author\":{\"name\":\"J\u00fcrgen Welzenbach\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/person\\\/dd3cdc59cbb669fb0280a19479a5b1ab\"},\"headline\":\"Howto debug Ceedling Unit-Tests\",\"datePublished\":\"2022-05-11T09:36:04+00:00\",\"dateModified\":\"2022-05-30T08:51:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/\"},\"wordCount\":1408,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/VS_Code_OpenDirector.png\",\"articleSection\":[\"Allgemein\",\"Software\",\"Testen\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/\",\"name\":\"Howto debug Ceedling Unit-Tests - MEDtech Ingenieur GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/VS_Code_OpenDirector.png\",\"datePublished\":\"2022-05-11T09:36:04+00:00\",\"dateModified\":\"2022-05-30T08:51:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/#primaryimage\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/VS_Code_OpenDirector.png\",\"contentUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/VS_Code_OpenDirector.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/howto-debug-ceedling-unit-tests\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Howto debug Ceedling Unit-Tests\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#website\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\",\"name\":\"MEDtech Ingenieur GmbH\",\"description\":\"Ingenieursdienstleister f\u00fcr Medizintechnik\",\"publisher\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\"},\"alternateName\":\"MEDtech\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/medtech-ingenieur.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\",\"name\":\"MEDtech Ingenieur\",\"alternateName\":\"MEDtech\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/logo-700x700-1.png\",\"contentUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/logo-700x700-1.png\",\"width\":700,\"height\":700,\"caption\":\"MEDtech Ingenieur\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/medtechIngenieur\",\"https:\\\/\\\/x.com\\\/MedtechIng\",\"https:\\\/\\\/www.instagram.com\\\/medtech.ingenieure\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/37871229\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/person\\\/dd3cdc59cbb669fb0280a19479a5b1ab\",\"name\":\"J\u00fcrgen Welzenbach\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/cropped-Med_Mit-013-scaled-1-96x96.jpg\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/cropped-Med_Mit-013-scaled-1-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/cropped-Med_Mit-013-scaled-1-96x96.jpg\",\"caption\":\"J\u00fcrgen Welzenbach\"},\"description\":\"J\u00fcrgen hat nach seinem Elektrotechnikstudium in Erlangen seine Diplomarbeit in Kooperation mit einem Hersteller von ophthalmologischen Ger\u00e4ten und der Universit\u00e4tsaugenklinik durchgef\u00fchrt. In zwei Erlanger Unternehmen fand er zur Embedded Software und hat vor allem HMIs f\u00fcr Baumaschinen und Laboranalyseger\u00e4te entwickelt.\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/en\\\/author\\\/jwelzenbach\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Howto debug Ceedling Unit Tests - MEDtech Ingenieur GmbH","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/medtech-ingenieur.de\/en\/howto-debug-ceedling-unit-tests\/","og_locale":"en_US","og_type":"article","og_title":"Howto debug Ceedling Unit-Tests - MEDtech Ingenieur GmbH","og_description":"Hintergrund Ceedling ist ein (zu Recht) weit verbreitetes und in Ruby entwickeltes Build-System f\u00fcr C-Projekte.\u00a0\u00a0 Zusammen mit Unity und CMock wird es in der Embedded Software-Entwicklung gerne eingesetzt. Nach einer gewissen Einarbeitungszeit sind Unit-Tests normalerweise recht z\u00fcgig erstellt. Idealerweise erstellt man die Tests zusammen mit der eigentlichen Implementierung. (Auf Test-Driven-Development will ich hier allerdings nicht [&hellip;]","og_url":"https:\/\/medtech-ingenieur.de\/en\/howto-debug-ceedling-unit-tests\/","og_site_name":"MEDtech Ingenieur GmbH","article_publisher":"https:\/\/www.facebook.com\/medtechIngenieur","article_published_time":"2022-05-11T09:36:04+00:00","article_modified_time":"2022-05-30T08:51:57+00:00","og_image":[{"url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector.png","type":"","width":"","height":""}],"author":"J\u00fcrgen Welzenbach","twitter_card":"summary_large_image","twitter_creator":"@MedtechIng","twitter_site":"@MedtechIng","twitter_misc":{"Written by":"J\u00fcrgen Welzenbach","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/#article","isPartOf":{"@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/"},"author":{"name":"J\u00fcrgen Welzenbach","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/person\/dd3cdc59cbb669fb0280a19479a5b1ab"},"headline":"Howto debug Ceedling Unit-Tests","datePublished":"2022-05-11T09:36:04+00:00","dateModified":"2022-05-30T08:51:57+00:00","mainEntityOfPage":{"@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/"},"wordCount":1408,"commentCount":2,"publisher":{"@id":"https:\/\/medtech-ingenieur.de\/#organization"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/#primaryimage"},"thumbnailUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector.png","articleSection":["Allgemein","Software","Testen"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/","url":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/","name":"Howto debug Ceedling Unit Tests - MEDtech Ingenieur GmbH","isPartOf":{"@id":"https:\/\/medtech-ingenieur.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/#primaryimage"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/#primaryimage"},"thumbnailUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector.png","datePublished":"2022-05-11T09:36:04+00:00","dateModified":"2022-05-30T08:51:57+00:00","breadcrumb":{"@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/#primaryimage","url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector.png","contentUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/05\/VS_Code_OpenDirector.png"},{"@type":"BreadcrumbList","@id":"https:\/\/medtech-ingenieur.de\/howto-debug-ceedling-unit-tests\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/medtech-ingenieur.de\/"},{"@type":"ListItem","position":2,"name":"Howto debug Ceedling Unit-Tests"}]},{"@type":"WebSite","@id":"https:\/\/medtech-ingenieur.de\/#website","url":"https:\/\/medtech-ingenieur.de\/","name":"MEDtech Ingenieur GmbH","description":"Engineering service provider for medical technology","publisher":{"@id":"https:\/\/medtech-ingenieur.de\/#organization"},"alternateName":"MEDtech","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/medtech-ingenieur.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/medtech-ingenieur.de\/#organization","name":"MEDtech Engineer","alternateName":"MEDtech","url":"https:\/\/medtech-ingenieur.de\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/logo\/image\/","url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2024\/01\/logo-700x700-1.png","contentUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2024\/01\/logo-700x700-1.png","width":700,"height":700,"caption":"MEDtech Ingenieur"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/medtechIngenieur","https:\/\/x.com\/MedtechIng","https:\/\/www.instagram.com\/medtech.ingenieure\/","https:\/\/www.linkedin.com\/company\/37871229\/"]},{"@type":"Person","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/person\/dd3cdc59cbb669fb0280a19479a5b1ab","name":"J\u00fcrgen Welzenbach","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2025\/04\/cropped-Med_Mit-013-scaled-1-96x96.jpg","url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2025\/04\/cropped-Med_Mit-013-scaled-1-96x96.jpg","contentUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2025\/04\/cropped-Med_Mit-013-scaled-1-96x96.jpg","caption":"J\u00fcrgen Welzenbach"},"description":"After completing his electrical engineering studies in Erlangen, J\u00fcrgen wrote his diploma thesis in cooperation with a manufacturer of ophthalmic devices and the university eye clinic. He then worked for two companies in Erlangen, where he discovered embedded software and primarily developed HMIs for construction machinery and laboratory analysis equipment.","url":"https:\/\/medtech-ingenieur.de\/en\/author\/jwelzenbach\/"}]}},"_links":{"self":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/6715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/users\/31"}],"replies":[{"embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/comments?post=6715"}],"version-history":[{"count":13,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/6715\/revisions"}],"predecessor-version":[{"id":6785,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/6715\/revisions\/6785"}],"wp:attachment":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/media?parent=6715"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/categories?post=6715"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/tags?post=6715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}