Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Code::Blocks, GDB] Breakpointy, a ścieżki relatywne

Ostatnio zmodyfikowano 2015-01-13 20:33
Autor Wiadomość
DejaVu
Temat założony przez niniejszego użytkownika
[Code::Blocks, GDB] Breakpointy, a ścieżki relatywne
» 2015-01-12 14:24:12
Próbuję znaleźć jakieś rozwiązanie, które będzie umożliwiało stawianie breakpointów w IDE w taki sposób, aby GDB otrzymywało ścieżki relatywne, a nie ścieżki absolutne. GDB niestety nie radzi sobie ze ścieżkami absolutnymi.

Coś tam czytałem, że można np. podczas uruchamiania gdb dodać paramretr --readnow ale to niestety nie jest rozwiązanie, ponieważ jest ono skuteczne tylko dla małych projektów. Dla projektu nad którym pracuję polecenie to wyczerpało 16GB RAM i zawiesiło system Ubuntu.

http://forums.codeblocks.org​/index.php?topic=4467.0

Sensowny opis problemu również został zawarty w temacie:
https://answers.launchpad.net​/gcc-arm-embedded/+question​/240419

/edit:
Tutaj krótka wzmianka o tym jak wymusić określony prefiks ścieżki dla symboli debugowych podczas kompilowania:
http://stackoverflow.com​/questions/16733387​/force-relative-debug-symbol-path-maven-native-plugin
P-124717
maly
» 2015-01-12 14:56:41
https://sourceware.org/gdb​/onlinedocs/gdb/Source-Path.html;
set substitute-path, ale nie próbowałem więc...
P-124721
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-symbols

Wł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.0
Tutaj 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
P-124724
maly
» 2015-01-12 16:41:57
set substitute-path from to
Przeglą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.
P-124735
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.
P-124783
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ć).
P-124834
« 1 »
  Strona 1 z 1