Depanarea aplicațiilor
Suportul pentru raportarea detaliată a erorilor apărute în timpul rulării aplicațiilor se adaugă foarte simplu:
#include <sys/debug.h>
static sysDebug Debugger;
La apariția unei erori în cadrul aplicației, este produs un fișier text salvat în directorul de documente al utilizatorului (în cazul Windows) sau în directorul principal al utilizatorului (în cazul Linux). În funcție de gravitatea erorii apărute și resursele încă disponibile, raportul conține cel puțin informațiile despre firul de execuție în care a apărut eroarea - valorile regiștrilor, ultimele valori din stivă. Dacă se poate, este inclusă și lista ultimelor apeluri din cod pentru a permite determinarea secvenței de operații ce a dus la apariția erorii.
Erorile ce nu provin din codul aplicației (posibil apărute în sistemul de operare sau în biblioteci externe) sunt ignorate întrucât există situații în care acestea sunt normale. Mai mult, posibilitatea de depanare a unor biblioteci externe este în general redusă!
Scripturile Makefile incluse asigură producere informațiilor de depanare necesare. Pentru Windows la fiecare fișier binar produs este asociat și un fișier PDB ce conține toate informațiile esențiale în procesul de depanare. În cazul Linux sunt produse două binare, unul ce are adăugat _Debug la nume și este rezultatul procesului de compilare și unul cu numele dorit, obținut prin ștergerea tuturor informațiilor de depanare. Deoarece informațiile de depanare pot permite înțelegerea unor algoritmi proprietari, pe lângă dimensiunea mare a acestora, se preferă omiterea lor în procesul de distribuire a aplicațiilor.
Exemplele de procesare a informațiilor din raportul produs se bazează pe următoarea linie de cod:
*((char*)nullptr) = 'a';
Windows
În cazul în care fișierul PDB asociat se regăsește în același director cu fișierul executat, indicațiile despre locația erorii sunt foarte clare:
Backtrace
main + 0000000000000217
F:\Public\Test\Locale_Test\Test.cpp:52 + 00000000
__scrt_common_main_seh + 000000000000010C
D:\agent\_work\9\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 + 00000022
BaseThreadInitThunk + 0000000000000014
În lipsa fișierului PDB, informațiile sunt reduse:
Backtrace
Test.exe + 0000000000001567
Test.exe + 000000000003605C
BaseThreadInitThunk + 0000000000000014
Prin încărcarea binarului într-o aplicație de depanare (debugger) ce suportă și fișiere PDB se poate asocia adresa relativă din raport la o linie de cod din sursele aplicației. O astfel de aplicație este x64dbg.
Linux
Raportul de eroare în cazul Linux nu conține decât adresele relative:
Backtrace: 5 entries
./Test(+0x629b)[0x7f9710c4129b]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x12730)[0x7f9710bf1730]
./Test(+0x3bed)[0x7f9710c3ebed]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb)[0x7f971071409b]
./Test(+0x3cea)[0x7f9710c3ecea]
Din lista de adrese raportate, primele două țin de mecanismul de raportare a erorilor și, prin urmare, trebuie ignorate. Adresa relativă semnificativă este, în acest caz, 0x3bed
. Pentru a determina linia de cod unde a apărut eroarea este necesară folosirea utilitarului addr2line și a binarului cu _Debug în nume:
addr2line -e ./Test_Debug 0x3bed
Rezultatul este:
/Public/Test/Locale_Test/Test.cpp:52