nixp.ru v3.0

25 мая 2017,
четверг,
23:11:31 MSK

DevOps с компанией «Флант»
Gnus написал 5 июля 2005 года в 00:24 (365 просмотров) Ведет себя неопределенно; открыл 16 тем в форуме, оставил 26 комментариев на сайте.

Имеется динамический массив строк. Когда требуется его очистить, я так понимаю, пишется такое:

for(i=0;i

В результате происходит нарушение сегментации, хотя просто free(str), (где i-любое число меньше kol_elem), без цикла, подобного не вызывает.

Долго чесал репу — в чём тут замес?

rgo

Да удалять надо так. Ошибка в другом месте… Скорее всего указатели в str получены не из malloc. Это ломает кучу, и в самый неожиданный момент приводит к SIGSEGV.

Я такого рода ошибки, в последнее время, ловлю при помощи:

valgrind --tool=memcheck ./a.out

Оч-чень рекомендую — ленивая тулза (в смысле — для ленивых). Не панацея, но помогает.

Gnus

А где есть по нем учебник? А то некоторые вещи, в частности:

Syscall param chdir(path) points to unaddressable byte(s)

at 0×1BA1577D: chdir (in /lib/i686/libc-2.2.5.so)

by 0×1BA8214D: XtCallCallbacks (in /usr/X11R6/lib/libXt.so.6.0

и

Address 0×1BC2244A is 0 bytes after a block of size 2 alloc’d

at 0×1B8FF29B: malloc (vg_replace_malloc.c:130)

by 0×8048BFD: Add (in /home/vasia/Documents/a.out)

в документации почему-то не описаны.

rgo
Gnus
А где есть по нем учебник?

А зачем тебе учебник? Словарь в руки и переводи что он тебе пишет.

Gnus
Syscall param chdir(path) points to unaddressable byte(s)

at 0×1BA1577D: chdir (in /lib/i686/libc-2.2.5.so)

by 0×1BA8214D: XtCallCallbacks (in /usr/X11R6/lib/libXt.so.6.0

по русски это звучит так:

параметр системного вызова chdir (path) указывает на неадресованные байты. Какие строки ты передавал в libXt.so?

Gnus
и

Address 0×1BC2244A is 0 bytes after a block of size 2 alloc’d

at 0×1B8FF29B: malloc (vg_replace_malloc.c:130)

by 0×8048BFD: Add (in /home/vasia/Documents/a.out)

в документации почему-то не описаны.

адрес 0×1bc2244a — 0 байт после блока размером 2 выделен. — Это видать нарушение кучи какое-то случилось.

А, вообще, компилируй (и линкуй тоже) с флагом -g3 (или можно -ggdb3). Тогда ещё понятнее станет:

вместо `by 0×8048bfd: Add (in /home/vasia/Documents/a.out)' будет писать

`by 0×8048bfd: Add (in /home/vasia/Documents/my_buggy_source.c:123)'

metal

C этой прогой идет достаточно подробная документация, следует ее почитать

Gnus
rgo
Какие строки ты передавал в libXt.so?

Из libXt я запрашивал.XawListShowCurrent() возвратила структуру XawListReturnStruct соответственно,строку из которой я и передал в chdir().

А вообще меня смутило выражение unaddressable. Как это понимать по отношению к параметру, который мне возвратили?

rgo

Кривой адрес у строки. Я с Xaw не возился, не знаю, что там может быть не так. Но что-то не так, а-адназначна. То ли нету этого Current, то ли ещё что-то. Логика то простая. Раз проблемы с указателем — значит надо искать откуда значение у этого указателя и почему это значение кривое.

rgo

кстати, а дебуггером слабо посмотреть, что это за строчка которую вернул XawListShowCurrent? Скорее всего дебуггер тебе скажет, что-нить типа address … is inaccessible

Gnus
rgo
Кривой адрес у строки.

Да со строкой-то всё в порядке, во всяком случае на консоль она выводится нормально. Интересно другое: если chdir() пердать строку, содержащую имена некоторых директорий, прога вываливается, хотя остальные глотает без проблем.

То есть chdir(«/home/vasia») — нарушение сегментации, а просто «/home» — работает. И от длины строки это не зависит.

rgo

Даже не знаю… Надо смотреть программу. Либо вот ещё что. Компилируй с флагом -Wall. может чего нового узнаешь.

Steck

А ты попробуй chdir(«/home/vasia/»)..?