addr2line, или Мне стыдно

Статья будет очень короткой.
Я столько лет писал и отлаживал, но даже и не знал о таком инструменте. А штука полезная, если неохота лезть в gdb.

Пишем глючную программу

Вот пример нерабочей программы:

void f() {
	int *p = 0x12345; /* Invalid address */
	*p = 5;
}

int main() {
	f();
	return 0;
}

Ошибка, естественно в 3-й строке. Но допустим мы ее не заметили. Соберем отладочный и релизный бинарники, например таким Makefile:

all: debug release

debug:
	gcc main.c -g -o main.debug

release:
	gcc main.c -o main.release
	strip main.release

Ааа! У меня ничего не работает!

Пользователь говорит, что ваша программа падает с загадочным segmentation fault. Но мы не боимся, и наша логика теперь простая.

Во-первых, смотрим вывод dmesg:

$ ./main.release
zsh: segmentation fault  ./main.release
$ dmesg | tail
....
[90461.350925] main.release[21028]: segfault at 12345 ip 00000000004004f4 sp 00007fffe640ce10 error 6 in main.release[400000+1000]

Вот мы узнали адрес, на котором произошел вылет — 0x00000000004004f4

И тут на арену выходит addr2line, которая по этому адресу и дебажному бинарнику говорит нам где ошибка:

$ addr2line -e main.debug 0x00000000004004f4                                                                                                          
/tmp/addr/main.c:3

Вот и все. Исправляем ошибку в третей строчке в файле main.c. Круто, правда?

Реклама

2 comments on “addr2line, или Мне стыдно

  1. Очень полезный пост. Спасибо большое!

  2. Сергей:

    Сам только узнал сегодня об этой полезнейшей утилите. Надеюсь, поможет мне найти мой баг =)

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s