LLDB (debugger) - LLDB (debugger)
tento článek se mohou příliš spoléhat na zdroje příliš úzce souvisí s tématem, což potenciálně brání tomu, aby článek byl ověřitelný a neutrální.Února 2015) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Vývojáři | Skupina vývojářů LLVM |
---|---|
Úložiště | |
Napsáno | C ++ |
Operační systém | Operační Systém Mac i386 a x86-64, Linux, FreeBSD, NetBSD, Okna |
Typ | Debugger |
Licence | UIUC (BSD styl ) Licence Apache 2.0 s výjimkami LLVM (v9.0.0 nebo novější)[1] |
webová stránka | lldb |
The LLDB debugger (LLDB) je debugger složka LLVM projekt. Je postaven jako sada opakovaně použitelných komponent, které ve velké míře využívají existující knihovny z LLVM, jako je Zvonit analyzátor výrazů a LLVM demontážník. LLDB je bezplatný open source software pod Licence Open Source na University of Illinois / NCSA,[2] A BSD styl permisivní softwarová licence. Od verze 9.0.0 byla licencována pro Licence Apache 2.0 s výjimkami LLVM.[1]
Aktuální stav
LLDB podporuje ladění programů zapsaných v C, Cíl-C, a C ++. The Rychlý komunita udržuje verzi, která přidává podporu pro daný jazyk. Je známo, že se na tom pracuje Operační Systém Mac, Linux, FreeBSD, NetBSD a Okna,[3] a podporuje i386, x86-64, a PAŽE instrukční sady.[4] LLDB je výchozí debugger pro Xcode 5 a novější. Android Studio také používá LLDB pro ladění.[5] LLDB lze použít z jiných IDE, včetně Kód Visual Studio,[6] Zatmění,[7] a CLion.[8]
Vlastnosti | FreeBSD | Linux | Operační Systém Mac | NetBSD | Okna |
---|---|---|---|---|---|
Zpětné sledování | |||||
Hraniční body | |||||
C ++ 11 | ? | ||||
Příkazový řádek nástroj lldb | |||||
Ladění základních souborů | |||||
Debugserver (vzdálené ladění) | |||||
Demontáž | |||||
Vyhodnocení výrazu | ? | Funguje s několika chybami | Funguje s několika chybami | Funguje s několika chybami | |
JIT ladění | ? | Pouze symbolické ladění | Nevyzkoušeno | Probíhá práce | |
Cíl-C 2.0: | ? | N / A | ? | N / A |
Příklady příkazů
lldb program | Ladit „program“ (z prostředí shell) |
---|---|
běh | Spusťte načtený program |
break set -n main | Nastavit zarážku na začátku funkce "hlavní" |
bt | Backtrace (v případě selhání programu) |
číst registr | Vypsat všechny registry |
di -n hlavní | Rozebrat funkci „hlavní“ |
Příklad relace
Zvažte následující nesprávný program napsaný v C:
#zahrnout <stdio.h>int hlavní(prázdnota){ char zpráva = "Ahoj světe! n"; printf("% s", zpráva); vrátit se 0;}
Za použití zvonit překladač zapnutý Operační Systém Mac, výše uvedený kód lze zkompilovat pomocí -G
příznak, který obsahuje příslušné ladicí informace o generovaném binárním souboru - včetně zdrojového kódu - což usnadňuje jeho kontrolu pomocí LLDB. Za předpokladu, že je pojmenován soubor obsahující výše uvedený kód test.c
, příkaz pro sestavení mohlo by být:
$ clang -g test.c -o test
A binární soubor lze nyní spustit:
$ ./testPorucha Segmentace
Vzhledem k tomu, že ukázkový kód při spuštění generuje a Porucha Segmentace, lldb lze použít ke kontrole problému:
$ lldb test(lldb) cíl vytvořit "test"Aktuální spustitelný soubor nastaven na 'test' (x86_64).(lldb) běhZahájen proces 70716: '/ Users / wikipedia / test' (x86_64)Proces 70716 byl zastaven* thread # 1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code = 1, address = 0xffffff90) frame # 0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18libsystem_platform.dylib`_platform_strlen:-> 0x7fff6c7c46f2 <+18>: pcmpeqb xmm0, xmmword ptr [rdi] 0x7fff6c7c46f6 <+22>: pmovmskb esi, xmm0 0x7fff6c7c46fa <+26>: a rcx, 0xf 0x7fff6c7c46fe <+30>: nebo rax, -0x1Cíl 0: (test) zastaven.
Problém nastává při volání funkce strlen
, ale můžeme spustit zpětný chod k identifikaci přesného řádku kódu, který způsobuje problém:
(lldb) bt* thread # 1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code = 1, address = 0xffffff90) * rám # 0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18 frame # 1: 0x00007fff6c66b16a libsystem_c.dylib`__vfprintf + 8812 rám # 2: 0x00007fff6c6911c3 libsystem_c.dylib`__v2printf + 475 snímek č. 3: 0x00007fff6c668e22 libsystem_c.dylib`vfprintf_l + 54 snímek č. 4: 0x00007fff6c666f72 libsystem_c.dylib`printf + 174 frame # 5: 0x0000000100000f6d test`main at test.c: 5: 2 frame # 6: 0x00007fff6c5dc3d5 libdyld.dylib`start + 1(lldb) seznam zdrojů 3 int main (void) { 4 znaky msg = "Dobrý den, svět! N"; 5 printf ("% s", msg); 6 návrat 0; 7 }
Z řádku začínajícího na rám # 5
, LLDB označuje, že chyba je na řádku 5 test.c
. Běh seznam zdrojů
, vidíme, že se to týká volání na printf
. Podle kódu výjimky EXC_BAD_ACCESS
ze zpátečky, strlen
se pokouší číst z oblasti paměti, do které nemá přístup dereferencování neplatný ukazatel.[9] Vrátíme-li se ke zdrojovému kódu, vidíme, že proměnná zpráva
je typu char
ale místo znaku obsahuje řetězec. Abychom problém vyřešili, upravíme kód tak, aby to naznačoval zpráva
je ukazatel na řetězec znaky
přidáním *
operátor:
#zahrnout <stdio.h>int hlavní(prázdnota){ char* zpráva = "Ahoj světe! n"; printf("% s", zpráva); vrátit se 0;}
Po překompilaci a opětovném spuštění spustitelného souboru poskytuje LLDB správný výsledek:
(lldb) cíl vytvořit "test"Aktuální spustitelný soubor nastaven na 'test' (x86_64).(lldb) běhZahájen proces 93319: '/ Users / wikipedia / test' (x86_64)Ahoj světe!Proces 93319 byl ukončen se stavem = 0 (0x00000000)(lldb)
LLDB spustí program, který vytiskne výstup printf
na obrazovku. Poté, co se program normálně ukončí, LLDB indikuje, že proces spuštěný programem byl dokončen, a vytiskne jeho stav ukončení.
Viz také
Reference
- ^ A b LICENSE.TXT, llvm.org, vyvoláno 2019-09-24
- ^ „Licence k vydání LLVM“
- ^ „Blog projektu LLVM“.
- ^ A b „Stav LLDB“. Citováno 28. listopadu 2019.
- ^ https://developer.android.com/studio/debug
- ^ „Přidat nový nástroj s názvem„ lldb-vscode “, který implementuje protokol adaptéru ladění kódu Visual Studio Code“.
- ^ „CDT / Uživatel / Časté dotazy“.
- ^ „Blog LLDB CLion“.
- ^ „Technická poznámka TN2151: Porozumění a analýza zpráv o selhání aplikace“. Archiv dokumentace. Vývojář Apple. Citováno 13. února 2020.