Информация о номере строки в инструментах ltrace и strace
Возможно ли, что я могу просмотреть номер строки и имя файла (для моей программы, работающей с ltrace / strace) вместе с информацией о вызове библиотеки / системном вызове.
Например:
code section :: ptr = malloc(sizeof(int)*5); (file:code.c, line:21)
трассировка или любой другой инструмент: malloc(20) :: code.c::21
Я перепробовал все варианты ltrace / strace, но не могу найти способ получить эту информацию.
Если это невозможно через ltrace / strace, есть ли у нас опция параллельного инструмента для GNU/Linux?
4 ответа
Вы можете использовать -i
опция (для вывода указателя инструкции во время вызова) в strace
а также ltrace
, в сочетании с addr2line
разрешать звонки на строки кода.
Нет, это невозможно. Почему бы вам не использовать GDB для этой цели?
Когда вы компилируете приложение с помощью gcc, используйте -ggdb flags, чтобы получить отладочную информацию в вашу программу, а затем запустите вашу программу с помощью gdb или эквивалентного интерфейса (DDD или аналогичного).
Вот краткое руководство GDB, чтобы помочь вам немного. http://www.cs.cmu.edu/~gilpin/tutorial/
Вы можете использовать strace-plus, который может собирать трассировки стека, связанные с каждым системным вызовом. http://code.google.com/p/strace-plus/
Довольно старый вопрос, но я нашел способ выполнить то, что хотел OP: сначала используйте strace с-k
вариант, который будет генерировать трассировку стека следующим образом:
openat(AT_FDCWD, NULL, O_RDONLY) = -1 EFAULT (неверный адрес) > /usr/lib/libc-2.33.so(__open64+0x5b) [0xefeab] > /usr/lib/libc-2.33.so(_IO_file_open+0x26) [0x816f6] > /usr/lib/libc-2.33.so(_IO_file_fopen+0x10a) [0x818ca] > /usr/lib/libc-2.33.so(__fopen_internal+0x7d) [0x7527d] > /mnt/r/build/tests/main(main+0x90) [0x1330] > /usr/lib/libc-2.33.so(__libc_start_main+0xd5) [0x27b25] > /mnt/r/сборка/тесты/главная(_start+0x2e) [0x114e]
Адрес каждого вызова функции отображается в конце каждой строки, и вы можете вставить его вaddr2line
чтобы получить файл и строку. Например, мы хотим найти вызов вmain()
(пятая строка трассировки стека).
addr2line -e tests/main 0x1330
Это покажет что-то вроде этого:
/mnt/r/main.c:55