Czy jest możliwe, że mogę wyświetlić numer linii i nazwę pliku (dla mojego programu działającego z ltrace/strace) wraz z informacjami o wywołaniu biblioteki/wywołaniu systemowym.

Na przykład:

code section :: ptr = malloc(sizeof(int)*5); (file:code.c, line:21)

Ltrace lub jakiekolwiek inne narzędzie: malloc(20) :: code.c::21

Wypróbowałem wszystkie opcje ltrace/strace, ale nie mogę znaleźć sposobu na uzyskanie tych informacji.

Jeśli nie jest to możliwe przez ltrace/strace, czy mamy jakąkolwiek opcję równoległego narzędzia dla GNU/Linuksa?

6
Sandeep Singh 24 lipiec 2011, 13:31

3 odpowiedzi

Najlepsza odpowiedź

Możesz być w stanie użyć opcji -i (aby wyprowadzić wskaźnik instrukcji w momencie wywołania) w strace i ltrace, w połączeniu z addr2line, aby rozwiązać wywołania do linii kodu.

6
Hasturkun 24 lipiec 2011, 14:53
3
Jak to może pomóc w strace, skoro wskaźnik instrukcji będzie w libc? Potrzebujesz kilku poziomów śledzenia wstecz, aby było to przydatne...
 – 
R.. GitHub STOP HELPING ICE
24 lipiec 2011, 17:11
@R..: stąd może, początkowo myślałem o dodaniu zastrzeżenia dotyczącego wywołań z bibliotek, które mogą również odnosić się do ltrace, ale nie mogłem znaleźć odpowiedniego sformułowania. Jest to jednak najbliższy wynik ltrace/strace.
 – 
Hasturkun
24 lipiec 2011, 17:31
Tak, dla ltrace działa dobrze. Dla strace nie jest w stanie znaleźć adresu. Czy mamy też sposób na mapowanie strace o/p do kodu?
 – 
Sandeep Singh
24 lipiec 2011, 17:34
@SandeepSingh: Problem polega na tym, że jeśli twój kod nie wykonuje samodzielnie wywołań systemowych (lub twoja biblioteka libc jest wbudowana w twój kod), adresy będą odpowiadać częściom biblioteki C, a nie twojemu kodowi. możesz użyć opcji ltrace -S, aby wyświetlić wywołania systemowe, a także wywołania biblioteki
 – 
Hasturkun
24 lipiec 2011, 17:44
Teraz jestem mocno w pułapce. Załóżmy, że mój kod zawiera funkcję opakowującą: mymalloc() dla malloc. Teraz addr2line mapuje malloc tylko na mymalloc, a nie na sekcję kodu, z której jest wywoływana.
 – 
Sandeep Singh
24 lipiec 2011, 17:56

Nie To niemożliwe. Dlaczego nie używasz do tego celu gdb?

Kiedy kompilujesz aplikację za pomocą gcc, użyj flag -ggdb, aby uzyskać informacje o debugerze do swojego programu, a następnie uruchom go z gdb lub równoważnym interfejsem (ddd lub podobnym)

Oto krótki podręcznik gdb, który może ci trochę pomóc. http://www.cs.cmu.edu/~gilpin/tutorial/

1
damir 24 lipiec 2011, 13:53
1
Dzięki, zawsze używam gdb podczas uruchamiania moich programów. Ale problem jest nieco inny: załóżmy, że mam dużą bazę kodu i otrzymuję wycieki pamięci. Jeśli zdołam rozgryźć numery linii, łatwiej złapię obraźliwy kod. Purify udostępnia te informacje, ale uważam, że jest to nieco mniej skuteczne w śledzeniu dokładnego punktu problemu
 – 
Sandeep Singh
24 lipiec 2011, 14:08

Możesz użyć strace-plus, który może zbierać ślady stosu powiązane z każdym wywołaniem systemowym. http://code.google.com/p/strace-plus/

0
m7yang 12 wrzesień 2013, 17:09