Различия
Здесь показаны различия между двумя версиями данной страницы.
Следующая версия | Предыдущая версия | ||
fullcircle:22:программа_на_си_ч6 [2010/04/12 23:41] создано |
fullcircle:22:программа_на_си_ч6 [2010/04/14 00:30] (текущий) |
||
---|---|---|---|
Строка 86: | Строка 86: | ||
</code> | </code> | ||
мы можем найти следующий кусок (некоторые пробелы пропущены): | мы можем найти следующий кусок (некоторые пробелы пропущены): | ||
- | **strlen("www.google.com") = 14*dcgettext(0, 0x8075c8a, 5, 0x804e66d, 0xbf8e1761) = 0x8075c8a*getaddrinfo("www.google.com", NULL, 0xbf8e1780, 0xbf8e17b4) = 0*calloc(1, 20) = 0x909c1e0*malloc(96) = 0x909c1f8*freeaddrinfo(0x909c100) = <void> | + | **strlen("www.google.com") = 14*dcgettext(0, 0x8075c8a, 5, 0x804e66d, 0xbf8e1761) = 0x8075c8a*getaddrinfo("www.google.com", NULL, 0xbf8e1780, 0xbf8e17b4) = 0*calloc(1, 20) = 0x909c1e0*malloc(96) = 0x909c1f8*freeaddrinfo(0x909c100) = <void> ** |
- | ** | + | |
Это то, что ltrace видит на этапе разрешения имени (DNS), рассмотренном нами ранее с помощью strace. Все сетевые коммуникации скрыты за простым вызовом 'getaddrinfo()'. | Это то, что ltrace видит на этапе разрешения имени (DNS), рассмотренном нами ранее с помощью strace. Все сетевые коммуникации скрыты за простым вызовом 'getaddrinfo()'. | ||
Я надеюсь, что теперь вы оценили значение strace и ltrace. Они позволяют вам изучить внутреннее устройство исполняемых файлов - без дополнительных усилий - с одной лишь разницей: выполнение происходит немного медленнее, это позволяет вам понять, что делает приложение, и где что-то пошло не так. | Я надеюсь, что теперь вы оценили значение strace и ltrace. Они позволяют вам изучить внутреннее устройство исполняемых файлов - без дополнительных усилий - с одной лишь разницей: выполнение происходит немного медленнее, это позволяет вам понять, что делает приложение, и где что-то пошло не так. | ||
Строка 179: | Строка 178: | ||
то вывод будет выглядеть так: | то вывод будет выглядеть так: | ||
- | **==7339== 100 bytes in 10 blocks are definitely lost in loss record 2 of 2* | + | <code c> |
+ | ==7339== 100 bytes in 10 blocks are definitely lost in loss record 2 of 2* | ||
==7339== at 0x4025D2E: malloc (vg_replace_malloc.c:207)* | ==7339== at 0x4025D2E: malloc (vg_replace_malloc.c:207)* | ||
==7339== by 0x8048405: leak (in /home/edb/fullcircle/c-6/memleak)* | ==7339== by 0x8048405: leak (in /home/edb/fullcircle/c-6/memleak)* | ||
==7339== by 0x8048443: main (in /home/edb/fullcircle/c-6/memleak) | ==7339== by 0x8048443: main (in /home/edb/fullcircle/c-6/memleak) | ||
- | ** | + | </code> |
Он по-прежнему говорит нам, что происходит утечка памяти, но уже не сообщает, в каком файле и в какой строке что-то идёт не так. | Он по-прежнему говорит нам, что происходит утечка памяти, но уже не сообщает, в каком файле и в какой строке что-то идёт не так. | ||
Итак, хорошая новость - valgrind сообщает нам, есть утечки памяти или нет. Плохая новость - нам нужен исполняемый файл с отладочной информацией, если мы хотим локализовать утечку. Мы можем перекомпилировать исполняемый файл для поиска и устранения неисправностей - для этого нам нужен исходный код! | Итак, хорошая новость - valgrind сообщает нам, есть утечки памяти или нет. Плохая новость - нам нужен исполняемый файл с отладочной информацией, если мы хотим локализовать утечку. Мы можем перекомпилировать исполняемый файл для поиска и устранения неисправностей - для этого нам нужен исходный код! | ||
Строка 189: | Строка 189: | ||
=====Выводы===== | =====Выводы===== | ||
В этой статье я рассказал об утилитах, позволяющих легко найти и устранить неисправности в исполняемых файлах, без необходимости иметь их исходники или дополнительные знания о файлах. В следующий раз мы попытаемся немножко углубиться и затем посмотрим на настоящий отладчик. | В этой статье я рассказал об утилитах, позволяющих легко найти и устранить неисправности в исполняемых файлах, без необходимости иметь их исходники или дополнительные знания о файлах. В следующий раз мы попытаемся немножко углубиться и затем посмотрим на настоящий отладчик. | ||
- | |||
=====Упражнения:===== | =====Упражнения:===== | ||
- | • vmstat - утилита, печатающая отчёт об использовании виртуальной памяти; используя strace, определите, какие файлы из /proc/ используются при генерации вывода. | + | * vmstat - утилита, печатающая отчёт об использовании виртуальной памяти; используя strace, определите, какие файлы из /proc/ используются при генерации вывода. |
- | • Повторите пример с ltrace/strace и wget, но с неправильным URL. Чей вывод позволит быстрее определить, что выведена неправильная DNS-запись? | + | * Элемент ненумерованного спискаПовторите пример с ltrace/strace и wget, но с неправильным URL. Чей вывод позволит быстрее определить, что выведена неправильная DNS-запись? |
- | • Прочтите man-страницу strace. Проследует ли strace автоматически в дочерний процесс? Какие меры вы должны принять при трассировке многопоточных приложений? | + | * Прочтите man-страницу strace. Проследует ли strace автоматически в дочерний процесс? Какие меры вы должны принять при трассировке многопоточных приложений? |
- | • Трассирует ли автоматически valgrind дочерние процессы? | + | * Трассирует ли автоматически valgrind дочерние процессы? |
- | • Попробуйте запустить valgrind с какой-нибудь из ваших любимых утилит командной строки. И проверьте, правильно ли она управляет памятью. | + | * Попробуйте запустить valgrind с какой-нибудь из ваших любимых утилит командной строки. И проверьте, правильно ли она управляет памятью. |
- | • Какие ещё утилиты являются частью набора valgrind, и как они могут вам помочь в написании высококачественных приложений? | + | * Какие ещё утилиты являются частью набора valgrind, и как они могут вам помочь в написании высококачественных приложений? |
---- | ---- | ||
Строка 216: | Строка 215: | ||
</style> | </style> | ||
- | {{tag>howto Си Програмирование Full_Circle}} | + | {{tag>howto Си Программирование Full_Circle}} |