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