DejaVu Temat założony przez niniejszego użytkownika |
[Code::Blocks, GDB] Breakpointy, a ścieżki relatywne » 2015-01-12 14:24:12 |
|
maly |
» 2015-01-12 14:56:41 |
|
DejaVu Temat założony przez niniejszego użytkownika |
» 2015-01-12 15:17:21 http://stackoverflow.com/questions/13362060/gcc-generate-absolute-paths-for-includes-in-debug-symbolsWłaśnie to samo znalazłem i chcę popatrzeć czy działa :) /edit: Niestety nie działa: (gdb) set substitute-path ../../src/ /home/uzytkownik/projektXYZ/src/ (gdb) b /home/uzytkownik/projektXYZ/src/content/plik.cpp:1331 No source file named /home/uzytkownik/projektXYZ/src/content/plik.cpp. Make breakpoint pending on future shared library load? (y or [n])
Plik nastomiast istnieje i jest to poprawna ścieżka. Natomiast jak podam polecenie do wczytuje się plik: (gdb) b plik.cpp:1331 Breakpoint 1 at 0xb65c9c02: file ../../src/plik.cpp, line 1331.
Ponowne napisanie wiersza z pełną ścieżką skutkuje poprawnym utworzeniem breakpointa: b /home/uzytkownik/projektXYZ/src/content/plik.cpp:1331 Breakpoint 2 at 0xb65c9c02: file ../../src/plik.cpp, line 1331.
Innymi słowy: polecenie set substitute-path SCIEZKA_STARA SCIEZKA_NOWA nie zadziałało zgodnie z oczekiwaniami. /edit: http://forums.codeblocks.org/index.php?topic=5354.0Tutaj też jest sugestia aby skorzystać ze wspomnianego polecenia ale niestety nie chce ono działać... :/ /edit2: Inny link, który również zawiera sensowne wskazówki, ale... problem nadal nie jest rozwiązany: http://forum.sysprogs.com/viewtopic.php?f=5&t=2968 |
|
maly |
» 2015-01-12 16:41:57 set substitute-path from toPrzeglądając internety wszędzie widzę że from i to są absolutnymi ścieżkami, więc przypuszczam że musiałbyś "przeliczyć" gdzie jest absolutna ścieżka dla ../../src/ i dopiero ją podać. Plain file names, relative file names with leading directories, file names containing dots, etc. are all treated as described above; for instance, if the source path is /mnt/cross, and the source file is recorded as ../lib/foo.c, gdb would first try ../lib/foo.c, then /mnt/cross/../lib/foo.c, and after that—/mnt/cross/foo.c. |
Tak się zastanawiam czy Twoje źródła zmieniły położenie czy tylko próbujesz ustawić alias dla ścieżek, bo substitute-path chyba działa tylko dla rzeczywistej zmiany położenia. |
|
DejaVu Temat założony przez niniejszego użytkownika |
» 2015-01-13 00:17:44 Generalnie rzecz biorąc wygląda na to, że: 1. Źródła projektu mam w katalogu A 2. Projekt jest kompilowany ze źródeł w katalogu B na urządzenie ze strukturą katalogów C Zauważyłem, że polecenie: (gdb) info sources
wypisuje mi ścieżki w stylu: /jakas/sciezka/do/katalogu-B/Debug/lib/../../src/plik.cpp
źródła leżą w katalogu: /inna/sciezka/do/katalogu-A/src/plik.cpp
z kolei polecenie basha: arm-none-eabi-objdump -W libBiblioteka.so | grep plik.cpp
pokazuje ścieżkę w stylu: ../../src/plik.cpp
GDB po wpisaniu polecenia: (gdb) b plik.cpp:1331
pokazuje, że breakpoint został postawiony w: Breakpoint 2 at 0xb65c9c02: file ../../src/plik.cpp, line 1331.
Code::Blocks stawia breakpointy do ścieżki: /inna/sciezka/do/katalogu-A/src/plik.cpp
Po wpisaniu pełnej ścieżki w GDB, którą używa Code::Blocks breakpoint się nie stawia: (gdb) b /inna/sciezka/do/katalogu-A/src/plik.cpp:1331 No source file named /inna/sciezka/do/katalogu-A/src/plik.cpp. Make breakpoint pending on future shared library load? (y or [n])
Innymi słowy teraz chyba muszę się pochylić nad tą plątaniną ścieżek. Chyba na dobry początek spróbuję posadzić Code::Blocks lub GDB na źródłach w katalogu /jakas/sciezka/do/katalogu-B/ zamiast /inna/sciezka/do/katalogu-A/, to może uda mi się dojść do setna sprawy. |
|
DejaVu Temat założony przez niniejszego użytkownika |
» 2015-01-13 20:33:57 Po przeanalizowaniu dokumentacji i licznych eksperymentach doszedłem do wniosku, że niestety GDB nie posiada polecenia, które umożliwiałoby skonfigurowanie podmieniania ścieżek relatywnych na inne. Eksperyment, który to potwierdza: (gdb) b ../../src/plik.cpp:1331
powyższy breakpoint zadziałał. Poniższy natomiast już nie: (gdb) b ../../src/../src/plik.cpp:1331
W związku z tym, że jest taki problem to stwierdziłem, że Code::Blocks powinien wystawiać ścieżki relatywne. Code::Blocks wystawia jednak ścieżki absolutne, więc jest lipa. Z tego co kojarzę Code::Blocks poprawnie stawiał breakpointy tylko wtedy, gdy plik z projektem *.cdp znajdował się w katalogu /src/ dla przedmiotowego przykładu. Code::Blocks nie ma niestety opcji, która umożliwiałaby sterowanie ścieżkami, jakie ma wysyłać IDE do GDB, więc postanowiłem napisać wrapper na GDB. Zadaniem wrappera jest przechwycenie standardowego wejścia i wyjścia GDB tak, aby można było podmieniać polecenia. Przechwytywanie standardowego wejścia/wyjścia we własnej aplikacji jest opisane w temacie: http://cpp0x.pl/forum/temat/?id=18388. Po wykonaniu aplikacji wrappującej (którą nazwałem virtualgdb), należy w ustawianiach IDE zamienić używany debugger z /usr/bin/gdb na /usr/bin/virtualgdb. Niestety to rozwiązanie wymaga sporego zachodu, jednak cel uświęca środki :) /edit: Dodam jeszcze, że jest cała masa tematów poruszających ten problem i jedynym rozwiązaniem jakie okazywało się skuteczne to set substitute-path pod warunkiem, że ścieżki były bezwzględne w skompilowanej aplikacji no i w zasadzie ten mechanizm rozwiązuje tylko problem zmiany lokalizacji plików źródłowych na dysku. Nie udało mi się skonfigurować GDB za pomocą wspomnianego polecenia do modyfikowania ścieżek podawanych przy stawianiu breakpointów i przypuszczam, że nie jest to możliwe (choć mogę się mylić). |
|
« 1 » |