Kunskapsbas saknas libltEABIgtgdbserver Problemet uppstår när VisualGDB inte kan hitta binär gdbserver i libltEABIgt-katalogen i ditt projekt. Gdbserver krävs för att felsöka din app och kopieras vanligtvis automatiskt av ndk-build-skriptet. Om ditt projekt saknar den här filen, kontrollera följande: Kontrollera att du bygger en debug-version. Ndk-make bör åberopas med NDKDEBUG1 argument. Du kan se ndk-make-argumenten i Output-fönstret i Visual Studio när du bygger din app. Du kan inte felsöka utgåvan av din app på grund av begränsningar av Android NDK. Kontrollera att din AndroidManifest. xml-fil innehåller android: debuggable attributet satt till true. Uppdatera din app och observera byggproduktionen i utmatningsfönstret. Det borde se ut som det här: 1gt c: android-ndk-r8ndk-build. cmd NDKDEBUG1 APPPLATFORMandroid-3 1gt Gdbserver. arm-linux-androideabi-4.4.3 libsarmeabigdbserver 1gt 1gt Gdbsetup. libsarmeabigdb. setup 1gt 1gt Install. libAndroidApp25.so gt libsarmeabilibAndroidApp25.so 1gt 1gt VisualGDB: Installerade en uppdaterad gdbserver till E: PROJECTSTEMPAndroidApp25libsarmeabigdbserver Den första fetlinjen som anger libsarmeabigdbserver ska alltid finnas närvarande. Den sista raden som anger en uppdaterad gdbserver kan saknas om du har inaktiverat gdb 7.x i VisualGDB Project Properties. Om ndk-build rapporterar att gdbserveren har kopierats till armeabi. men VisualGDB förväntar sig det i armeabi-v7a. det betyder att din enhet har laddat armeabi-biblioteken och kräver att gdbserver ska installeras till armeabi-mappen. I så fall öppnar du Application. mk-filen och ser till att armeabi finns i APPABI-definitionen. Om ndk-build inte kan kopiera gdbserver, se till att du använder den senaste NDK (åtminstone r8) och att filen ltNDKgttoolchainsarm-linux-androideabi-4.4.3prebuiltgdbserver finns.16. Felsökning av fjärrprogram 16.1 Använda gdbserverprogrammet gdbserver är ett kontrollprogram för Unix-liknande system, som låter dig ansluta ditt program med en avlägsen GDB via målavstånd --- men utan att länka i den vanliga felsökningstuben. gdbserver är inte en komplett ersättning för felsökningsstubbarna, eftersom det i huvudsak kräver samma operativsystemfaciliteter som GDB själv gör. Faktum är att ett system som kan köra gdbserver för att ansluta till en avlägsen GDB också kan köra GDB lokalt. Gdbserver är ibland användbart ändå eftersom det är ett mycket mindre program än GDB självt. Det är också lättare att port än alla GDB, så du kan komma igång snabbare på ett nytt system med hjälp av gdbserver. Slutligen, om du utvecklar kod för realtidssystem, kan du upptäcka att avvikelserna i realtidssamarbete gör det bekvämare att göra så mycket utvecklingsarbete som möjligt på ett annat system, till exempel genom sammansättning. Du kan använda gdbserver för att göra ett liknande val för debugging. GDB och gdbserver kommunicerar via antingen en seriell linje eller en TCP-anslutning, med standard GDB-fjärr seriellt protokoll. På målmaskinen måste du ha en kopia av det program du vill felsöka. gdbserver behöver inte din programsymboltabell, så du kan ta bort programmet om det behövs för att spara utrymme. GDB på värdsystemet gör all symbolhantering. För att kunna använda servern måste du berätta hur du kommunicerar med GDB namnet på ditt program och argumenten för ditt program. Den vanliga syntaxen är: Comm är antingen ett enhetnamn (för att använda en seriell linje) eller ett TCP-värdnamn och portnummer. Till exempel, för att felsöka Emacs med argumentet foo. txt och kommunicera med GDB över seriell port devcom1. gdbserver väntar passivt för att värddatorn ska kommunicera med den. Att använda en TCP-anslutning istället för en seriell linje: Den enda skillnaden från det föregående exemplet är det första argumentet som anger att du kommunicerar med värddatabasen via TCP. Värd: 2345-argumentet innebär att gdbserver ska förvänta sig en TCP-anslutning från maskinvärd till lokal TCP-port 2345. (För närvarande ignoreras värddelen.) Du kan välja vilket nummer du vill ha för portnumret så länge det inte konflikt med alla TCP-portar som redan används på målsystemet (till exempel 23 är reserverat för telnet). (5) Du måste använda samma portnummer med fjärrkommandot för värd GDB. På vissa mål kan gdbserver också bifogas löpande program. Detta uppnås via --attach-argumentet. Syntaxen är: pid är process ID för en pågående process. Det är inte nödvändigt att peka gdbserver vid ett binärt för körprocessen. På GDB-värddatorn behöver du en obegränsad kopia av ditt program, eftersom GDB behöver symboler och felsökningsinformation. Starta GDB som vanligt, med namnet på den lokala kopian av ditt program som det första argumentet. (Du kan också behöva alternativet --baud om serielinjen körs på något annat än 9600bps.) Använd sedan fjärrkontrollen för att upprätta kommunikation med gdbserver. Dess argument är antingen ett enhetnamn (vanligtvis en seriell enhet, som devttyb) eller en TCP-portdeskriptor i formulärdatorn. HAMN. Till exempel: 16.2 Använda programmet gdbserve. nlm gdbserve. nlm är ett kontrollprogram för NetWare-system, som låter dig ansluta ditt program med en fjärransluten GDB via mål fjärrkontroll. GDB och gdbserve. nlm kommunicerar via en seriell linje, med standard GDB fjärr seriellt protokoll. På målmaskinen måste du ha en kopia av det program du vill felsöka. gdbserve. nlm behöver inte ditt programsymboltabell så att du kan ta bort programmet om det behövs för att spara utrymme. GDB på värdsystemet gör all symbolhantering. För att kunna använda servern måste du berätta hur du kommunicerar med GDB namnet på ditt program och argumenten för ditt program. Syntaxen är: bräda och port ange seriell rad baud anger baudhastigheten som används av anslutningen. port och nod standard till 0, baud standard till 9600bps. Till exempel, för att felsöka Emacs med argumentet foo. txt och kommunicera med GDB över seriell port nummer 2 eller bräde 1 med en 19200bps-anslutning: På GDB-värdmaskinen behöver du en obegränsad kopia av ditt program, eftersom GDB behöver symboler och felsökning information. Starta GDB som vanligt, med namnet på den lokala kopian av ditt program som det första argumentet. (Du kan också behöva alternativet --baud om serielinjen körs på något annat än 9600bps. Därefter använder du mål fjärrkontroll för att skapa kommunikation med gdbserve. nlm. Argumentet är ett enhetnamn (vanligtvis en seriell enhet, som devttyb ). Till exempel: Kommunikation med servern via seriell linje devttyb. 16.3 Implementera en fjärrstub Stubfilerna med GDB implementerar målsidan av kommunikationsprotokollet och GDB-sidan implementeras i GDB-källfilen remote. c. Normalt , kan du helt enkelt låta dessa subrutiner kommunicera och ignorera detaljerna. (Om du genomför din egen stubfil kan du fortfarande ignorera detaljerna: starta med en av de befintliga stubfilerna. sparc-stub. c är den bäst organiserade, och därför enklast att läsa.) För att felsöka ett program som körs på en annan maskin (felsökningsmålmaskinen) måste du först ordna alla vanliga förutsättningar för att programmet ska driva sig själv. Till exempel, för ett C-program behöver du : En stjärna tup rutin för att ställa in C runtime miljö dessa brukar ha ett namn som crt0. Startrutinen kan levereras av din maskinvaruleverantör, eller du kanske måste skriva din egen. Ett C-subrutin bibliotek för att stödja dina program subrutin samtal, särskilt hantering av ingång och utgång. Ett sätt att få ditt program till den andra maskinen - till exempel ett nedladdningsprogram. Dessa levereras ofta av hårdvarufabrikanten, men det kan hända att du måste skriva själv från maskinvaruhandboken. Nästa steg är att ordna att ditt program använder en seriell port för att kommunicera med den maskin där GDB körs (värdmaskinen). Generellt sett ser systemet så här ut: På GDB förstår förstå hur man använder det här protokollet när allting är inställt. Du kan helt enkelt använda fjärrkommandot (se avsnittet Ange ett felsökningsmål). På målet måste du länka med ditt program några speciella delrutiner som implementerar GDBs fjärr seriella protokoll. Filen som innehåller dessa subrutiner kallas för debugging-stubben. På vissa avlägsna mål kan du använda ett hjälpprogram gdbserver istället för att länka en stub i ditt program. Se avsnittet Använda gdbserver-programmet. för detaljer. Felsökningsstubben är specifik för fjärrmaskinens arkitektur, till exempel, använd sparc-stub. c för att felsöka program på SPARC-kort. Dessa fungerande fjärrstubbar distribueras med GDB: i386-stub. c För Intel 386 och kompatibla arkitekturer. m68k-stub. c För Motorola 680x0 arkitekturer. sh-stub. c För Hitachi SH-arkitekturer. sparc-stub. c För SPARC-arkitekturer. sparcl-stub. c För Fujitsu SPARCLITE-arkitekturer. README-filen i GDB-distributionen kan lista andra andra tillagda stubbar. 16.3.1 Vad stubben kan göra för dig Felsökningsstubben för din arkitektur levererar dessa tre subrutiner: setdebugtraps Denna rutin ordnar att handtagsexception ska köras när ditt program stannar. Du måste kalla detta underrutin uttryckligen nära början av ditt program. handtagsexception Detta är den centrala arbetshorsen, men ditt program kallar det aldrig uttryckligt - inställningskoden ordnar för handtagsexception att springa när en fälla utlöses. hanteringsexception tar kontroll när ditt program stannar vid körning (till exempel på en brytpunkt) och förmedlar kommunikation med GDB på värddatorn. Det här är kommunikationsprotokollet som genomförs handtexception fungerar som GDB-representanten på målmaskinen. Det börjar med att skicka sammanfattande information om tillståndet för ditt program och fortsätter sedan att utföra, hämta och överföra information som GDB behöver tills du utför ett GDB-kommando som gör ditt program återupptagna vid den tiden, handmatningsfel returnerar kontrollen till din egen kod på målmaskinen. brytpunkt Använd denna hjälpsubrutin för att få ditt program att innehålla en brytpunkt. Beroende på den särskilda situationen kan detta vara det enda sättet för GDB att få kontroll. Till exempel, om din målmaskin har någon form av avbrytningsknapp, behöver du inte ringa detta genom att trycka på avbrytningsknappen överför kontrollen till hanteringsexceptionen --- i själva verket till GDB. På vissa maskiner kan du bara ta emot tecken på serieporten också utlösa en fälla igen, i så fall behöver du inte ringa brytpunkten från ditt eget program. Det går bara att köra mål fjärrkontroll från värddatorns GDB-session. Ring brytpunkt om ingen av dessa är sanna, eller om du helt enkelt vill se till att ditt program stannar vid en förutbestämd punkt för början av din debugging-session. 16.3.2 Vad du måste göra för stubben Felsökningsstubbarna som följer med GDB är inställda för en viss chiparkitektur, men de har ingen information om resten av din felsökningsmålmaskin. Först och främst måste du berätta för stuben hur man kommunicerar med seriell port. int getDebugChar () Skriv denna underrutin för att läsa en enda karaktär från seriell port. Det kan vara identiskt med getchar för ditt målsystem ett annat namn används för att du ska kunna skilja de två om du vill. void putDebugChar (int) Skriv den här subrutinen för att skriva en enda bokstav till seriell port. Det kan vara identiskt med putchar för ditt målsystem ett annat namn används för att du ska kunna skilja de två om du vill. Om du vill att GDB ska kunna stoppa ditt program medan det körs måste du använda en avbrottsdriven seriell drivrutin och ordna att den ska sluta när den tar emot en C (003. kontroll-C-tecknet). Det är den karaktär som GDB använder för att berätta för fjärrsystemet att sluta. Att få felsökningsmålet för att återställa rätt status till GDB kräver förmodligen ändringar i standardstubben. Ett snabbt och smutsigt sätt är att bara utföra en brytpunktsinstruktion (den smutsiga delen är att GDB rapporterar en SIGTRAP istället för en SIGINT). Andra rutiner som du behöver tillhandahålla är: void exceptionHandler (int undantagsnummer. Void exceptionaddress) Skriv den här funktionen för att installera undantagsadress i undantagshanteringstabellerna. Du behöver göra det eftersom stubben inte har något sätt att veta vad undantagshanteringstabellerna på ditt målsystem är som (till exempel kan processortabellen vara i ROM, innehållande poster som pekar på en tabell i RAM). exceptionnumber är undantagsnumret som ska ändras, dess betydelse är arkitekturberoende (till exempel kan olika siffror representera delning med noll, feljusterad åtkomst etc). När detta undantag inträffar bör kontrollen överföras direkt till undantagsadressen. och processortillståndet (stapel, register osv.) ska vara precis som det är när ett processorns undantag uppstår. Så om du vill använda en hoppinstruktion för att nå undantagsadress. Det borde vara ett enkelt hopp, inte ett hopp till subrutinen. För 386 bör undantagsadress installeras som en avbrottsgrind så att avbrott maskeras medan handlaren körs. Porten ska vara på privilegiumnivå 0 (den mest privilegierade nivån). SPARC - och 68k-stubbarna kan maskera avbrott själva utan hjälp från exceptionHandler. void flushicache () Endast på SPARC och SPARCLITE, skriv denna underrutin för att spola instruktionscachen, om någon, på din målmaskin. Om det inte finns någon instruktionscache kan detta subrutin vara en no-op. På målmaskiner som har instruktionscacher kräver GDB denna funktion för att säkerställa att tillståndet för ditt program är stabilt. Du måste också se till att det här biblioteket är tillgängligt: void memset (void, int, int) Det här är standardbiblioteksfunktionen memset som sätter ett minnesområde till ett känt värde. Om du har en av de fria versionerna av libc. a. memset kan hittas där annars, måste du antingen hämta det från din hårdvarufabrikat eller skriva ditt eget. Om du inte använder GNU C-kompilatorn, kan du behöva andra standardbibliotekets subrutiner, och detta varierar från en stub till en annan, men i allmänhet är stubbarna troligen att använda någon av de gemensamma bibliotekets subrutiner som gcc genererar som inline-kod. men om innan du ringer upp setdebugtraps. du ställer in det för att peka på en funktion i ditt program, den funktionen heter när GDB fortsätter efter att ha stoppat på en fälla (till exempel busfel). Funktionen som anges med undantagHook kallas med en parameter: en int som är undantagsnumret. Kompilera och länka ihop: ditt program, GDB-debugging-stubben för din målarkitektur och de stödjande subrutinerna. Se till att du har en serieanslutning mellan din målmaskin och GDB-värd och identifiera seriell port på värden. Ladda ner ditt program till din målmaskin (eller få det där oberoende av vad tillverkaren tillhandahåller) och starta det. För att starta fjärrfelsökning, kör GDB på värddatorn och ange det program som körs i fjärrmaskinen som en körbar fil. Detta berättar för GDB hur du hittar dina programsymboler och innehållet i ren text. Upprätta kommunikation med hjälp av fjärrkontrollen för mål. Dess argument anger hur man kommunicerar med målmaskinen - antingen via en devicename kopplad till en direkt seriell linje eller en TCP-port (vanligtvis till en terminalserver som i sin tur har en seriell linje till målet). Till exempel, för att använda en seriell linje som är ansluten till enheten med namnet devttyb. För att använda en TCP-anslutning, använd ett argument av formulärvärden: porten. Till exempel, för att ansluta till port 2828 på en terminalserver med namnet manyfarms. Om ditt fjärrmål verkligen körs på samma maskin som din debugger-session (t. ex. en simulator för ditt mål som körs på samma värd), kan du släppa värdnamnet. Till exempel att ansluta till port 1234 på din lokala dator: Observera att kolon fortfarande krävs här. Nu kan du använda alla vanliga kommandon för att undersöka och ändra data och för att gå och fortsätta fjärrprogrammet. Om du vill fortsätta fjärrprogrammet och sluta felsöka det, använd kommandot lösen. När GDB väntar på fjärrprogrammet, försöker GDB att stoppa programmet om du skriver avbrottstecken (ofta C-C). Detta kan eller kanske inte lyckas, beroende delvis på hårdvaran och seriella drivrutiner fjärrsystemet använder. Om du skriver in avbrottstecken igen, visar GDB den här prompten: Om du skriver y. GDB överger fjärrfelsökningssessionen. (Om du bestämmer dig för att du försöker igen senare, kan du använda mål fjärrkontrollen igen för att ansluta en gång till.) Om du skriver n. GDB går tillbaka till väntan. Vänligen skicka FSF amp GNU förfrågningar amp frågor till gnugnu. org. Det finns också andra sätt att kontakta FSF. Dessa sidor underhålls av GDB-utvecklarna. Copyright Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111, USA. Verbatim kopiering och distribution av hela denna artikel är tillåten i något medium, förutsatt att detta meddelande bevaras. Detta dokument genererades av GDB-administratören den 29 mars 2002 med hjälp av texi2htmlFör debugging Android-appar med gdb Jag vill använda den fristående versionen av gdb direkt på Android-enheten. Finns det någon förbyggd binär version av gdb för Android tillgänglig Observera att jag letar efter den fullständiga gdb-versionen för Android, inte den förknippade gdbserveren. Bakgrund: Jag vet att Android NDK innehåller gdbserver, men om du inte felsöker dina egna program har du källkod för att konfigurera gdbserver och gdb-värddelen är fe komplex. Jag försökte det länge men nu är jag klar med det - det lägger till för många komplexitet och fallgropar till hela felsökningsprocessen. Dessutom försökte jag bygga gdb själv med hjälp av fristående verktygskedjan som genererades av android-ndk - men processen misslyckades på grund av kodfel. frågade jan 22 13 kl 15:49
No comments:
Post a Comment