Opcje binarne ramienia gdbserver ramię


Baza wiedzy Brakuje libltEABIgtgdbserver Ten problem występuje, gdy VisualGDB nie może znaleźć binarnego gdbserver wewnątrz katalogu libltEABIgt swojego projektu. Gdbserver jest potrzebny do debugowania Twojej aplikacji i zazwyczaj jest kopiowany automatycznie przez skrypt ndk-build. Jeśli w projekcie brakuje tego pliku, sprawdź następujące elementy: Upewnij się, że budujesz wersję debugera. Ndk-make powinien zostać wywołany z argumentem NDKDEBUG1. Podczas tworzenia aplikacji możesz wyświetlić argumenty ndk-make w oknie Wyjście w Visual Studio. Nie można debugować wersji kompilacji aplikacji ze względu na ograniczenia Androida NDK. Upewnij się, że plik AndroidManifest. xml zawiera atrybut android: debuggable ustawiony na true. Odbuduj aplikację i obserwuj produkcję pakietu Build w oknie Wyjście. Powinien wyglądać podobnie do tego: 1gt c: android-ndk-r8ndk-build. cmd NDKDEBUG1 APPPLATFORMandroid-3 1gt Gdbserver. ram-linux-androideabi-4.4.3 libsarmeabigdbserver 1gt 1gb Gdbsetup. libsarmeabigdb. setup 1gt 1gt Zainstaluj. libAndroidApp25.so gt libsarmeabilibAndroidApp25.so 1gt 1gt VisualGDB: Zainstalowano zaktualizowany serwer gdbserver do adresu E: PROJECTSTEMPAndroidApp25libsarmeabigdbserver Pierwszy odważny wiersz wspomnieć o libsarmeabigdbserverze zawsze powinien być obecny. Ostatnia linia wspomniająca o zaktualizowanym pliku gdbserver może zostać pominięta, jeśli w projekcie VisualGDB zostało wyłączone gdb 7.x. Jeśli ndk-build zgłasza, że ​​serwer gdbserver został skopiowany do armeabi. ale VisualGDB oczekuje w armeabi-v7a. oznacza to, że urządzenie załadowało biblioteki armeabi i wymaga zainstalowania programu gdbserver w folderze armeabi. W takim przypadku otwórz plik Application. mk i upewnij się, że armeabi jest w definicji APPABI. Jeśli ndk-build nie może skopiować serwera gdbserver, upewnij się, że używasz najnowszego NDK (przynajmniej r8) i że istnieje plik ltNDKgttoolchainsarm-linux-androideabi-4.4.3prebuiltgdbserver.16. Debugowanie programów zdalnych 16.1 Korzystanie z programu gdbserver Program gdbserver jest programem sterującym dla systemów uniksopodobnych, które umożliwia podłączenie programu do zdalnego GDB za pomocą pilota docelowego --- bez łączenia się w zwykły stub debugowania. gdbserver nie jest pełną wymianą poprawek debugowania, ponieważ wymaga zasadniczo takich samych urządzeń systemu operacyjnego, jakie GDB robi. W rzeczywistości system, który może uruchamiać serwer gdbserver, aby połączyć się z zdalnym GDB może również działać lokalnie gdbserver GDB, jest czasem użyteczny, ponieważ jest znacznie mniejszym programem niż sam GDB. Łatwiej jest też port niż wszystkie GDB, dzięki czemu można szybciej rozpocząć korzystanie z nowego systemu przy użyciu gdbserver. Wreszcie, jeśli opracujesz kod dla systemów w czasie rzeczywistym, może się okazać, że kompromisy związane z operacją w czasie rzeczywistym sprawią, że bardziej wygodne jest jak największe prace nad rozwojem w innym systemie, na przykład poprzez zestawianie krzyżowe. Możesz użyć gdbserver do podobnego wyboru do debugowania. GDB i gdbserver komunikują się za pomocą linii szeregowej lub połączenia TCP, używając standardowego protokołu zdalnego portu GDB. Na komputerze docelowym potrzebna jest kopia programu, z którą chcesz debugować. gdbserver nie potrzebuje tablicy symboli programu, więc w razie potrzeby możesz usunąć program, aby zaoszczędzić miejsce. GDB w systemie hosta obsługuje wszystkie manipulowanie symbolami. Aby używać serwera, musisz poinformować go, jak komunikować się z GDB o nazwie swojego programu i argumentach dla swojego programu. Zwykłą składnią jest: comm to albo nazwa urządzenia (do używania linii szeregowej), albo nazwa hosta TCP i numer portu. Na przykład, aby debugować Emacs z argumentem foo. txt i komunikować się z GDB przez port szeregowy devcom1. gdbserver oczekuje biernie na komunikowanie się przez gospodarza GDB. Aby używać połączenia TCP zamiast wiersza szeregowego: jedyną różnicą w porównaniu z poprzednim przykładem jest pierwszy argument, określający, że komunikujesz się z hostem GDB przez TCP. Host: argument 2345 oznacza, że ​​gdbserver ma oczekiwać połączenia TCP z hosta maszynowego z lokalnym portem TCP 2345. (Obecnie część hosta jest ignorowana). Możesz wybrać dowolny numer dla numeru portu, o ile nie konflikt z dowolnymi portami TCP już używanymi w systemie docelowym (na przykład 23 jest zarezerwowany dla telnet). (5) Musisz użyć tego samego numeru portu za pomocą zdalnego polecenia docelowego GDB hosta. W niektórych obiektach serwer gdbserver może również dołączać do uruchomionych programów. Można to osiągnąć za pomocą argumentu --attach. Składnia to: pid to identyfikator procesu aktualnie działającego procesu. Nie jest konieczne wskazywanie serwera gdbserver w binarnym procesie uruchamiania. W maszynie hosta GDB potrzebna jest nieokreślona kopia programu, ponieważ GDB potrzebuje symboli i debugowania informacji. Uruchom GDB jak zwykle, używając nazwy pierwszego egzemplarza lokalnego programu. (Być może potrzebna będzie opcja --baud, jeśli linia szeregowa działa w dowolnym innym miejscu niż 9600bps). Następnie użyj pilota docelowego w celu nawiązania komunikacji z serwerem gdbserver. Jego argumentem jest albo nazwa urządzenia (zwykle urządzenie szeregowe, takie jak devttyb) lub deskryptor portu TCP w hostie formularza. PORT. Na przykład: 16.2 Korzystanie z programu gdbserve. nlm Program gdbserve. nlm jest programem sterującym dla systemów NetWare, który umożliwia podłączenie programu do zdalnego GDB przez zdalny pilot. GDB i gdbserve. nlm komunikują się za pośrednictwem linii szeregowej, używając standardowego protokołu zdalnego portu GDB. Na komputerze docelowym potrzebna jest kopia programu, z którą chcesz debugować. gdbserve. nlm nie potrzebuje tablicy symboli programów, więc w razie potrzeby można usunąć program, aby zaoszczędzić miejsce. GDB w systemie hosta obsługuje wszystkie manipulowanie symbolami. Aby używać serwera, musisz poinformować go, jak komunikować się z GDB o nazwie swojego programu i argumentach dla swojego programu. Składnia to: tablica i port określają bajt szeregowy określa szybkość transmisji wykorzystywaną przez połączenie. port i węzeł domyślnie ustawione na 0, baudy ustawione na 9600bps. Na przykład, aby debugować Emacs z argumentem foo. txt i komunikować się z GDB przez port szeregowy numer 2 lub 1, używając połączenia z szybkością 19200bps: Na maszynie hosta GDB potrzebna jest nieokreślona kopia programu, ponieważ GDB potrzebuje symboli i debugowania Informacja. Uruchom GDB jak zwykle, używając nazwy pierwszego egzemplarza lokalnego programu. (Może być potrzebna opcja --baud, jeśli linia szeregowa działa w dowolnym innym miejscu niż 9600bps), a następnie użyj zdalnego pilota, aby nawiązać łączność z gdbserve. nlm. Jej argument to nazwa urządzenia (zwykle urządzenie szeregowe, np. Devttyb Na przykład: komunikacja z serwerem za pośrednictwem linii szeregowej devttyb 16.3 Wdrażanie zdalnego stubu Udostepnione pliki z plikami GDB implementują docelową stronę protokołu komunikacyjnego, a strona GDB jest implementowana w pliku źródłowym GDB zdalnym. c. Normalnie , możesz po prostu zezwolić tym podprogramom komunikować się i ignorować szczegóły (jeśli jesteś implementacją własnego pliku stubu, nadal możesz zignorować szczegóły: sparc-stub. c jest najlepiej zorganizowanym, a tym samym najłatwiejszy do odczytania). Aby debugować program uruchomiony na innej maszynie (maszyna docelowa debugowania), należy najpierw zaaranżować wszystkie podstawowe warunki wstępne dla samego programu, np. w przypadku programu C potrzebujesz : Gwiazda tup w celu skonfigurowania środowiska wykonawczego C, mają zwykle nazwę crt0. Procedura uruchamiania może być dostarczona przez dostawcę sprzętu lub być może trzeba napisać własną. Biblioteka podprogramów C obsługująca podprogramy programów, w szczególności zarządzanie wejściami i wyjściami. Sposób na przeniesienie programu do innej maszyny - na przykład program do pobierania. Są one często dostarczane przez producenta sprzętu, ale być może trzeba napisać własną dokumentację sprzętową. Następnym krokiem jest zorganizowanie programu do korzystania z portu szeregowego do komunikacji z urządzeniem, na którym działa GDB (maszyna hosta). Ogólnie rzecz biorąc, system wygląda tak: Na komputerze głównym GDB już rozumie, jak używać tego protokołu, gdy wszystko jest skonfigurowane, można po prostu użyć zdalnego polecenia docelowego (zobacz sekcję Określanie docelowego obiektu debugowania). W celu docelowym musisz połączyć się z programem kilka podprogramów specjalnych, które implementują zdalny protokół szeregowy GDB. Plik zawierający te podprogramy nazywany jest debugowaniem. W niektórych odległych celach zamiast łączenia stubu z programem można użyć programu dodatkowego gdbserver. Patrz sekcja Korzystanie z programu gdbserver. dla szczegółów. Stub debugowania jest specyficzny dla architektury zdalnej maszyny, na przykład użyj sparc-stub. c do debugowania programów na płytach SPARC. Te zdalne stuby robocze są dystrybuowane z serwerem GDB: i386-stub. c dla architektur Intel 386 i zgodnych. m68k-stub. c Dla architektur Motorola 680x0. sh-stub. c W architekturach Hitachi SH. sparc-stub. c W przypadku architektur SPARC. sparcl-stub. c W architekturach Fujitsu SPARCLITE. Plik README w dystrybucji GDB może zawierać listę ostatnio dodanych stubów. 16.3.1 To, co stub może zrobić dla Ciebie Stub debugowania dla Twojej architektury dostarcza te trzy podprogramy: setdebugtraps Ta procedura organizuje, aby handleexception działał, gdy program się zatrzyma. Musisz wywołać tę podprogram jawnie na początku swojego programu. handleexception Jest to centralna robota, ale Twój program nigdy nie wywołuje go wyraźnie - kod konfiguracji organizuje obsługę handleexception, gdy uruchamia się pułapkę. handleexception przejmuje kontrolę, gdy program zatrzymuje się podczas wykonywania (na przykład w punkcie przerwania) i mediuje komunikację z GDB na komputerze hosta. W tym miejscu realizowany jest protokół komunikacyjny, a działanie przedstawiciela GDB na docelowej maszynie pełni rolę przedstawiciela GDB. Rozpoczyna się od wysłania informacji podsumowujących informacje o stanie Twojego programu, a następnie kontynuuje wykonywanie, pobieranie i przekazywanie wszelkich potrzeb GDB informacyjnych, aż do wykonania polecenia GDB, które powoduje, że program wznowi pracę w tym punkcie, handleexception zwraca kontrolę do własnego kodu na maszyna docelowa. punkt przerwania Użyj tej podprogramu pomocniczego, aby program zawierał punkt przerwania. W zależności od konkretnej sytuacji może to być jedyny sposób na kontrolę przez GDB. Na przykład, jeśli maszyna docelowa ma jakiś przycisk przerwania, nie musisz dzwonić, naciskając przycisk przerywania, przesuwa kontrolę na handleexception - w efekcie, na GDB. Na niektórych komputerach po prostu odbieranie znaków na porcie szeregowym może również powodować pułapkę, w tej sytuacji nie trzeba dzwonić do punktu przerwania z własnego programu - wystarczy, że uruchomi się cel z odległej sesji GDB hosta. Wywołaj punkt przerwania, jeśli żaden z nich nie jest prawdziwy lub jeśli chcesz, aby Twój program zatrzymał się w określonym punkcie na początku sesji debugowania. 16.3.2 Co musisz zrobić dla stubu Czytniki debugowania pochodzące z GDB są skonfigurowane dla określonej architektury chipa, ale nie mają informacji na temat reszty maszyny docelowej do debugowania. Przede wszystkim musisz poinformować stub, jak komunikować się z portem szeregowym. int getDebugChar () Napisz tę podprogram do odczytu pojedynczego znaku z portu szeregowego. Może to być identyczne z getchar dla twojego systemu docelowego, inna nazwa jest używana, aby można było odróżnić je od Twoich potrzeb. void putDebugChar (int) Wpisz tę podprogram, aby napisać pojedynczy znak do portu szeregowego. Może to być identyczne z putchar dla twojego systemu docelowego, aby inna nazwa była używana, aby można było odróżnić je od Twoich potrzeb. Jeśli chcesz, aby GDB mógł zatrzymać program podczas jego pracy, musisz użyć sterownika seryjnego przerwanego i zażądać zatrzymania, gdy otrzyma C (003. znak kontrolny-C). Jest to znak, który GDB używa do powiedzenia zdalnemu systemowi, aby zatrzymał się. Uzyskanie docelowego celu debugowania w celu przywrócenia prawidłowego statusu do GDB prawdopodobnie wymaga zmiany standardowego skrótu, a szybkim i brudnym sposobem jest tylko wykonanie instrukcji przerwania (część brudna jest taka, że ​​GDB zgłasza SIGTRAP zamiast SIGINT). Inne procedury, które musisz dostarczyć to: void exceptionHandler (int exceptionnumer) void exceptionaddress Napisz tę funkcję, aby zainstalować exceptionaddress w tabelach obsługi wyjątków. Musisz to zrobić, ponieważ stub nie ma żadnego sposobu na zrozumienie, jakie są tabele obsługi wyjątków w systemie docelowym (na przykład w tabeli ROM procesorów mogą znajdować się wpisy, które wskazują na stół w pamięci RAM). exceptionnumber jest numerem wyjątku, który powinien zostać zmieniony, jego znaczenie zależy od architektury (na przykład różne liczby mogą reprezentować dzielenie przez zero, niewłaściwy dostęp itp.). Gdy wystąpi ten wyjątek, sterowanie powinno zostać przekazane bezpośrednio do wyjątku. a stan procesora (stos, rejestry itp.) powinien być taki sam jak w przypadku wystąpienia wyjątku procesora. Więc jeśli chcesz użyć instrukcji skoku, aby uzyskać dostęp do wyjątku. to powinien być prosty skok, a nie skok do podprogramu. Dla 386, wyjątek adresu wyjątku powinien być zainstalowany jako brama przerwania, tak aby przerwać przerwanie podczas obsługi programu. Brama powinna znajdować się na poziomie uprawnień 0 (najbardziej uprzywilejowany poziom). Serwery SPARC i 68k mogą same maskować zakłócenia bez pomocy exceptionHandler. void flushicache () Tylko w przypadku SPARC i SPARCLITE napisz tę podprogram, aby przenieść instrukcję podręczną, jeśli takowa, na komputerze docelowym. Jeśli nie ma pamięci podręcznej instrukcji, ta podprogram może nie działać. Na maszynach docelowych, w których są przechowywane instrukcje, GDB wymaga tej funkcji, aby upewnić się, że stan Twojego programu jest stabilny. Należy również upewnić się, że ta biblioteka jest dostępna: void memset (void, int, int) Jest to standardowa biblioteka funkcji memset, która określa obszar pamięci na znaną wartość. Jeśli masz jedną z bezpłatnych wersji libc. a. memset można znaleźć w inny sposób, musisz albo uzyskać go od producenta sprzętu lub napisać własną. Jeśli nie używasz kompilatora GNU C, możesz potrzebować innych standardowych podprogramów bibliotecznych, a to różni się w zależności od jednego stubu, ale generalnie stuby prawdopodobnie będą używać dowolnej z podprogramów wspólnego biblioteki, które gcc generuje jako kod wierszowy. ale przed wywołaniem setdebugtraps. ustawisz go w celu wskazania funkcji w programie, która jest wywoływana, gdy GDB kontynuuje pracę po zatrzymaniu się w pułapkę (na przykład błąd magistrali). Funkcja wskazana przez exceptionHook jest wywoływana z jednym parametrem: int, który jest numerem wyjątku. Skompiluj i łącz siebie: Twój program, stub debugowania GDB dla Twojej architektury docelowej oraz obsługiwane podprogramy. Upewnij się, że masz połączenie szeregowe między komputerem docelowym a hostem GDB i zidentyfikuj port szeregowy w komputerze. Pobierz program do urządzenia docelowego (lub pobierz go w dowolny sposób) i uruchom go. Aby uruchomić zdalne debugowanie, uruchom GDB na komputerze hosta i określ plik wykonywalny jako program, który działa na zdalnym komputerze. To mówi GDB, jak znaleźć swoje symbole programów i zawartość czystego tekstu. Ustalić komunikację przy użyciu zdalnego polecenia. Jego argument określa, jak komunikować się z komputerem docelowym - albo przez nazwę devicename dołączoną do bezpośredniej linii szeregowej, albo do portu TCP (zazwyczaj do serwera terminali, który z kolei ma linię szeregową do celu). Na przykład użyj linii szeregowej podłączonej do urządzenia o nazwie devttyb. Aby użyć połączenia TCP, użyj argumentu hosta form: port. Na przykład, aby połączyć się z portem 2828 na serwerze terminali o nazwie manyfarms. Jeśli zdalny cel jest rzeczywiście uruchomiony na tej samej maszynie, co sesja debugera (na przykład symulator twojego celu działającego na tym samym hoście), możesz pominąć nazwę hosta. Na przykład, aby połączyć się z portem 1234 na komputerze lokalnym: Należy pamiętać, że dwukropek jest nadal wymagany tutaj. Teraz można używać wszystkich zwykłych poleceń do zbadania i zmiany danych, a także do kroku i kontynuowania zdalnego programu. Aby wznowić zdalny program i zatrzymać debugowanie, użyj polecenia odłączenia. Kiedy GDB czeka na program zdalny, jeśli wpiszesz znak przerwania (często C-C), GDB próbuje zatrzymać program. Może to się zdarzyć lub nie, zależnie od sprzętu i sterowników seryjnych, z którego korzysta zdalny system. Jeśli ponownie wpisujesz znak przerwania, GDB wyświetli ten monit: Jeśli wpiszesz y. GDB porzuca zdalną sesję debugowania. (Jeśli zdecydujesz się spróbować później, możesz użyć zdalnego pilota ponownie, aby połączyć się ponownie.) Jeśli wpiszesz n. GDB wraca do oczekiwania. Proszę wysłać prośby GNU FSF z pytaniami o amp do gnugnu. org. Istnieją także inne sposoby skontaktowania się z FSF. Strony te są utrzymywane przez programistów GDB. Copyright Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111, USA. Kopiowanie i rozpowszechnianie tego całego artykułu przez firmę Verbatim dozwolone jest na dowolnym nośniku, pod warunkiem że niniejsze zawiadomienie zostanie zachowane. Ten dokument został wygenerowany przez administratora GDB w marcu, 29 2002 przy użyciu texi2htmlDla debugowania aplikacji na Androida z gdb Chcę używać autonomicznej wersji gdb bezpośrednio na urządzeniu z Androidem. Czy jest jakaś wstępnie zbudowana binarna wersja gdb dla Androida? Uwaga: szukam pełnej wersji gdb dla Androida, a nie okaleczonego serwera gdbserver. Tło: Wiem, że Android NDK zawiera gdbserver, jednak jeśli nie debugujesz własnych programów, masz kod źródłowy do skonfigurowania serwera gdbserver, a część hosta gdb jest złożona z bajki. Próbowałem to długo, ale teraz z tym skończyłem - dodaje się zbyt wiele złożoności i pułapek do całego procesu debugowania. Ponadto próbowałem sam budować gdb używając standalone-toolchain generowanego przez android-ndk - ale proces ten nie powiedzie się z powodu błędów kodu. zapytał 22 stycznia o godz. 15:49

Comments

Popular Posts