{"id":1449,"date":"2018-02-10T14:32:34","date_gmt":"2018-02-10T13:32:34","guid":{"rendered":"http:\/\/www.xpablo.cz\/?p=1449"},"modified":"2020-07-05T22:13:02","modified_gmt":"2020-07-05T20:13:02","slug":"z-notysku-vyvojare-jak-zachytit-obcasny-pad-aplikace-v-esp8266","status":"publish","type":"post","link":"http:\/\/www.xpablo.cz\/?p=1449","title":{"rendered":"Z not\u00fdsku v\u00fdvoj\u00e1\u0159e &#8211; Jak zachytit ob\u010dasn\u00fd p\u00e1d aplikace v ESP8266"},"content":{"rendered":"<p><a href=\"https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/01\/a02-exception-cause-decoding.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1450 alignleft\" src=\"https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/01\/a02-exception-cause-decoding-300x201.png\" alt=\"\" width=\"300\" height=\"201\" srcset=\"http:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/01\/a02-exception-cause-decoding-300x201.png 300w, http:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/01\/a02-exception-cause-decoding.png 713w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>D\u0159\u00edve, nebo pozd\u011bji se s t\u00edm setk\u00e1 ka\u017ed\u00fd, kdo tvo\u0159\u00ed aplikace na mikrokontrol\u00e9ry &#8211; skv\u011bl\u00e1, t\u00e9m\u011b\u0159 hotov\u00e1 aplikace ob\u010das spadne. Ne tak \u010dasto, aby se p\u00e1d dal zachytit debuggerem (pokud se d\u00e1 k hardware v\u016fbec p\u0159ipojit), ale p\u0159\u00edli\u0161 \u010dasto na to, aby bylo mo\u017en\u00e9 p\u00e1dy ignorovat. St\u00e1v\u00e1 se to i p\u0159i programov\u00e1n\u00ed ESP8266 a to \u010dast\u011bji, ne\u017e by se mohlo zd\u00e1t (ti, kdo pou\u017e\u00edvaj\u00ed intenz\u00edvn\u011b komunikuj\u00edc\u00ed s\u00e9riov\u00fd port pomoc\u00ed knihovny SoftwareSerial o tom zcela nepochybn\u011b v\u00ed sv\u00e9). Lad\u011bn\u00ed t\u011bchto situac\u00ed b\u00fdv\u00e1 velmi obt\u00ed\u017en\u00e9 a zdlouhav\u00e9, ale na\u0161t\u011bst\u00ed pro n\u00e1s existuje v p\u0159\u00edpad\u011b ESP8266 cesta, jak si pr\u00e1ci usnadnit. SDK, poskytovan\u00e9 p\u0159\u00edmo od Espressif obsahuje mo\u017enost, jak p\u0159i p\u00e1du aplikace zavolat u\u017eivatelskou funkci, kter\u00e1 se jmenuje custom_crash_callback(&#8230;). Funkce je volan\u00e1 z postmortem stavu p\u0159\u00edmo z j\u00e1dra (weak alias je definovan\u00fd v core_esp8266_postmortem.c ). Jej\u00ed pou\u017eit\u00ed ale m\u00e1 n\u011bjak\u00e1 \u00faskal\u00ed &#8211; nesm\u00ed se pou\u017e\u00edt dynamick\u00e1 alokace, blokovac\u00ed funkce (serial, network, delay, &#8230;) a vykon\u00e1n\u00ed funkce nesm\u00ed trvat p\u0159\u00edli\u0161 dlouho, proto\u017ee HW watchdog st\u00e1le b\u011b\u017e\u00ed. N\u00e1pad tedy spo\u010d\u00edv\u00e1 v tom, \u017ee se do EEPROM ulo\u017e\u00ed informace o p\u00e1du, kter\u00e9 se daj\u00ed pou\u017e\u00edt pro n\u00e1slednou anal\u00fdzu. Tento n\u00e1pad m\u011blo p\u0159ede mnou u\u017e v\u00edce v\u00fdvoj\u00e1\u0159\u016f, tak\u017ee vznikla knihovna <a href=\"https:\/\/github.com\/krzychb\/EspSaveCrash\">EspSaveCrash<\/a>, kter\u00e1 ale bohu\u017eel ignoruje zapov\u011bzen\u00ed dynamick\u00e9 alokace, tak\u017ee pokud vznikl p\u00e1d aplikace z d\u016fvodu probl\u00e9mu na heapu, EspSaveCrash nebude fungovat spr\u00e1vn\u011b. Napsal jsem tedy vlastn\u00ed variantu, kter\u00e1 vych\u00e1z\u00ed z uveden\u00e9 knihovny, ale netrp\u00ed t\u00edmto neduhem a kterou pou\u017e\u00edv\u00e1m ji\u017e \u0159adu m\u011bs\u00edc\u016f.<\/p>\n<p><!--more--><\/p>\n<p>Nejd\u0159\u00edve je t\u0159eba \u0159\u00edct, \u017ee se nejedn\u00e1 o knihovnu v prav\u00e9m slova smyslu &#8211; jedn\u00e1 se o samostatn\u00fd .ino soubor, kter\u00fd je um\u00edst\u011bn\u00fd ve stejn\u00e9m adres\u00e1\u0159i, jako hlavn\u00ed skript. Vyu\u017e\u00edv\u00e1m zde vlastnosti, kdy ArduinoBuilder\/PIO p\u0159i ka\u017ed\u00e9 kompilaci nejd\u0159\u00edve sestav\u00ed pro p\u0159eklad do\u010dasn\u00fd soubor, kter\u00fd sest\u00e1v\u00e1 z vhodn\u011b poskl\u00e1dan\u00fdch v\u0161ech .ino, kter\u00e9 jsou nalezeny v adres\u00e1\u0159i projektu.<\/p>\n<p>Modul poskytuje tyto funkce:<\/p>\n<p><strong>void crashClear(void)<\/strong> &#8211; vyma\u017ee v\u0161echny informace o z\u00e1znamech p\u0159edchoz\u00edch p\u00e1d\u016f.<\/p>\n<p><strong>void crashGet(String &amp;out)<\/strong> &#8211; vr\u00e1t\u00ed HTML form\u00e1tovan\u00fd seznam zaznamenan\u00fdch p\u00e1d\u016f v\u010detn\u011b v\u0161ech zaznamenan\u00fdch informac\u00ed.<\/p>\n<p><strong>int crashGetCount(void)<\/strong> &#8211; vr\u00e1t\u00ed po\u010det zaznamenan\u00fdch p\u00e1d\u016f.<\/p>\n<p><strong>int crashSanityCheck(void)<\/strong> &#8211; ov\u011b\u0159\u00ed stav oblasti pro zaznamen\u00e1v\u00e1n\u00ed p\u00e1d\u016f.<\/p>\n<p>Ve sv\u00fdch aplikac\u00edch to pou\u017e\u00edv\u00e1m tak, \u017ee na <strong>crashClear<\/strong> nam\u00ed\u0159\u00edm webovou str\u00e1nku cc (abych z webov\u00e9ho rozhran\u00ed mohl vymazat star\u00e9 z\u00e1znamy\/poprv\u00e9 nainicializovat oblast), no a <strong>crashGet<\/strong> mi dopln\u00ed text do webov\u00e9 str\u00e1nky cg, tak\u017ee vid\u00edm v\u0161echny zaznamenan\u00e9 p\u00e1dy p\u0159\u00edmo v prohl\u00ed\u017ee\u010di.<\/p>\n<p>Konfigurace je velmi jednoduch\u00e1 &#8211; p\u0159edpokl\u00e1d\u00e1m definici indexu v EEPROM, do kter\u00e9ho se budou z\u00e1znamy ukl\u00e1dat (<strong>SAVE_CRASH_EEPROM_OFFSET<\/strong>) a velikost EEPROM vyhrazenou pro z\u00e1znamy p\u00e1d\u016f (<strong>SAVE_CRASH_SPACE_SIZE<\/strong>). EEPROM mus\u00ed b\u00fdt spu\u0161t\u011bna v u\u017eivatelsk\u00e9 aplikaci (EEPROM.begin(&#8230;) ) a je na tv\u016frci aplikace, aby zajistil vyhrazen\u00ed odpov\u00eddaj\u00edc\u00ed velikosti pro pr\u00e1ci crash.ino .<\/p>\n<p>Modul byl testov\u00e1n s Core verze 2.3.0, 2.4.0 a git verze.<\/p>\n<p>No a na z\u00e1v\u011br vlastn\u00ed modul ke sta\u017een\u00ed:<\/p>\n<div class=\"wpfilebase-file-default\" onclick=\"if('undefined' == typeof event.target.href) document.getElementById('wpfb-file-link-1').click();\">\r\n  <div class=\"icon\"><a href=\"http:\/\/www.xpablo.cz\/?wpfb_dl=37\" target=\"_blank\" title=\"Download Crash\"><img decoding=\"async\" align=\"middle\" src=\"http:\/\/www.xpablo.cz\/wp-includes\/images\/crystal\/archive.png\" alt=\"Crash\" \/><\/a><\/div>\r\n  <div class=\"filetitle\">\r\n    <a href=\"http:\/\/www.xpablo.cz\/?wpfb_dl=37\" title=\"Download Crash\" target=\"_blank\" id=\"wpfb-file-link-1\">Crash<\/a>\r\n    \r\n    <br \/>\r\n    crash.zip<br \/>\r\n    \r\n  <\/div>\r\n  <div class=\"info\">\r\n    2.1 KiB<br \/>\r\n    1277 Downloads<br \/>\r\n    <a href=\"#\" onclick=\"return wpfilebase_filedetails(1);\">Detaily<\/a>\r\n  <\/div>\r\n  <div class=\"details\" id=\"wpfilebase-filedetails1\" style=\"display: none;\">\r\n  \r\n  <table border=\"0\">\r\n   \r\n   \r\n   \r\n   \r\n   \r\n   \r\n   <tr><td><strong>Datum:<\/strong><\/td><td>10. \u00fanora  2018<\/td><\/tr>\r\n  <\/table>\r\n  <\/div>\r\n <div style=\"clear: both;\"><\/div>\r\n<\/div>\n<p>Pro zv\u00eddav\u011bj\u0161\u00ed jsou zde odkazy k dal\u0161\u00edmu studiu:<\/p>\n<p><a href=\"http:\/\/arduino-esp8266.readthedocs.io\/en\/latest\/faq\/a02-my-esp-crashes.html\">http:\/\/arduino-esp8266.readthedocs.io\/en\/latest\/faq\/a02-my-esp-crashes.html<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/SuperHouse\/esp-open-rtos\/wiki\/Crash-Dumps\">https:\/\/github.com\/SuperHouse\/esp-open-rtos\/wiki\/Crash-Dumps<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/esp8266\/Arduino\/issues\/1152\">https:\/\/github.com\/esp8266\/Arduino\/issues\/1152<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u0159\u00edve, nebo pozd\u011bji se s t\u00edm setk\u00e1 ka\u017ed\u00fd, kdo tvo\u0159\u00ed aplikace na mikrokontrol\u00e9ry &#8211; skv\u011bl\u00e1, t\u00e9m\u011b\u0159 hotov\u00e1 aplikace ob\u010das spadne. Ne tak \u010dasto, aby se p\u00e1d dal zachytit debuggerem (pokud se d\u00e1 k hardware v\u016fbec p\u0159ipojit), ale p\u0159\u00edli\u0161 \u010dasto na to, aby bylo mo\u017en\u00e9 p\u00e1dy ignorovat. St\u00e1v\u00e1 se to i p\u0159i programov\u00e1n\u00ed ESP8266 a to &hellip; <a href=\"http:\/\/www.xpablo.cz\/?p=1449\" class=\"more-link\">Pokra\u010dov\u00e1n\u00ed textu <span class=\"screen-reader-text\">Z not\u00fdsku v\u00fdvoj\u00e1\u0159e &#8211; Jak zachytit ob\u010dasn\u00fd p\u00e1d aplikace v ESP8266<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[3,25],"tags":[36,82,18,81],"class_list":["post-1449","post","type-post","status-publish","format-standard","hentry","category-arduino","category-esp8266","tag-arduino","tag-crash","tag-esp8266","tag-z-notysku-vyvojare"],"_links":{"self":[{"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/posts\/1449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1449"}],"version-history":[{"count":21,"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/posts\/1449\/revisions"}],"predecessor-version":[{"id":1635,"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/posts\/1449\/revisions\/1635"}],"wp:attachment":[{"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1449"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.xpablo.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}