(решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

MysticCoder
постоялец
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Сообщение MysticCoder »

vitaly_l писал(а):Как обнаружить порчу памяти???


стать избранным, посвященным в таинства древнего и почти забытого ритуала отладки
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

MysticCoder писал(а):стать избранным, посвященным в таинства древнего и почти забытого ритуала отладки

Я готов, стать посвящённым, т.к. по прежнему работает только метод предложенный Пупсиком. Метод мне нравится, но краешком мозга я понимаю, что проблема - где-то висит в виде хитрого бага. И от бага нужно избавится.

Можно меня посвятить в двух трёх словах в магический забытый всеми ритуал отладки? :oops:
:roll: Что для этого нужно и каков порядок действий? :cry: :cry: :cry:

.
MysticCoder
постоялец
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Сообщение MysticCoder »

vitaly_l писал(а):Что для этого нужно и каков порядок действий?


я бы вернул код в FormClose как было,

Код: Выделить всё

procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  b:byte;
begin
  try

  finally
    for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
  end;
end;

поставил бы бряк на цикл, дальше пошагово, на каком элементе упадет, что в этот момент там находится. можно "распечатать" массив, как ранее уже предлагали, адреса всех элементов в массиве, ну не всех, а 23. Далее уже смотреть, на каком этапе работы программы этот элемент на котором все падает стал таким кривым.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

MysticCoder писал(а):можно "распечатать" массив, как ранее уже предлагали

Я не понимаю, как распечатать массив? Куда нажать, чтобы он "рапечатался" ?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

vitaly_l, можно, например, прочитать указатели как числа и вывести их значения, а можно завести метод печатающий содержимое элементов.
Аватара пользователя
beria
постоялец
Сообщения: 130
Зарегистрирован: 29.09.2016 07:57:13

Сообщение beria »

vitaly_l писал(а):Я не понимаю, как распечатать массив?



Я лично в подобных спорных случаях всегда присваиваю указателям явно значение ноль и перед удалением смотрю его по Assigned.. Точно также это значение можно вывести и в консоль.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Отладчик тоже сломался...
Вложения
error_otlad.jpg
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Код: Выделить всё

var
  f: TextFile;
...
AssignFile(f, 'stderr.txt');
Rewrite(f);
Writeln(f, 'We are inside class with Self=', PtrUInt(Pointer(Self)));
for b := 0 to 22 do begin
  Writeln(f, 'Trying to delete arrBitmap[', b, ']=', PtrUInt(Pointer(arrBitmap[b])));
  arrBitmap[b].Free;
end;
CloseFile(f);


Отладчик тоже сломался...

Обычная ситуация для программы с SIGSEGV'ом же.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Дож писал(а):Обычная ситуация для программы с SIGSEGV'ом же.

Круто - спасибо, Дож!

Код: Выделить всё

We are inside class with Self=18655648
Trying to delete arrBitmap[0]=18383520
Trying to delete arrBitmap[1]=18383648
Trying to delete arrBitmap[2]=18383776
Trying to delete arrBitmap[3]=18383904
Trying to delete arrBitmap[4]=18384032
Trying to delete arrBitmap[5]=18384160
Trying to delete arrBitmap[6]=18384288
Trying to delete arrBitmap[7]=18384416
Trying to delete arrBitmap[8]=18384544


В общем нашёл, где был перелом у программы... Отключил чёртов отладчик, в смысле запустил программу без Лазаруса и тогда выскочила ошибка указывающая на место сбоя в программе. Всё оказалось очень-очень просто, после messageBox (с вопросом), программа пыталась перерисовать экран и взять картинку из битмапов в массиве, но битмапы, к тому времени - уже успевали очистится. А без картинок, в массиве - перерисовка экрана давала сбой.

А метод Пупсика, работал, потому что, присваивал битмапам Nil соответственно и сбой тоже исчезал, т.к. получалось assign(nil). В общем, всем спасибо, что помогли разобраться и настояли на том, чтобы я всё таки нашёл, где у неё перелом. Перелом - действительно был серьёзный.

Поставил костыль из boolean, который запрещает перерисовку при закрытии и теперь всё работает безупречно, как в не-швейцарских часах, что висят в кабине пилота, на межгалактическом галактикалёте, который сотворил Землю и остальное, многообразие видов. :wink: :roll: :cry:

Но различные способы отладки, по прежнему - интересны, особенно с примерами, как показал: добрый и мульти-уважаемый Дож.

:arrow: :arrow: :arrow: ВСЕМ СПАСИБО!!!

.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>программа пыталась перерисовать экран и взять картинку из битмапов в массиве, но битмапы, к тому времени - уже успевали очистится
А посмотрел бы стек вызовов сразу - всего этого мозголюбви бы небыло. Ну элементарнве та вещи ты должен знать, несмотря на слово от которого происходит твоя профессия))
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):А посмотрел бы стек вызовов сразу

zub - в основном программирую на PHP, там нет всех этих инструментов, там, всё что создаётся - само удаляется. И код я пишу там в обычном блокноте++, это удобнее всего.

Поэтому для меня непонятны фразы:
1) посмотрел бы стек - как посмотреть стек ???
2) вот я, функцией Дожа - получил адреса. И что что вы с ними потом делаете?
3) присваиваю указателям явно значение ноль и перед удалением смотрю его по Assigned.. Точно также это значение можно вывести и в консоль. - почему ноль а не nil ? Как смотреть по Assigned? Вывести в консоль? Консоль это cmd? Но у меня не консольная программа.
4) прочитать указатели как числа и вывести их значения, а можно завести метод печатающий содержимое элементов - ну вот адреса получены и что сними делать? Что за метод печатающий содержимое элементов? Как его завести?
5) можно "распечатать" массив, как ранее уже предлагали - я не понимаю, как распечатывают массив? Это своя функция или она в IDE есть?

.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

1 - вид\окна отладки\стек вызовов или простосто ctrl+alt+s после вылета ты там увидишь цепочку вызовов приведшую к вылету. Соответственно, ты бы сразу понял что вылет при отображении, а не отображается оно потому что оно уничтожено...
Кстати, в первом посте ты нас обманул.
2 - первое предположение - ссылки в массиве на одно и тоже, или nil. ты бы увидел некоторые одинаковые элементы или nil
3 - считай что
if assigned(p)...
и
if p<>nil ...
одно и тоже
соответственно проверяя ты избегаешь действия с уже уничтоженой сущностью
4 думать вокруг них головой. например организовать лог
5 своя
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):Кстати, в первом посте ты нас обманул.

Скорее себя, т.к. был уверен, что сбой в массиве, потому что, на массив показывал Лазарус и и говорил, мне, что там SIGSEGV.

zub писал(а):1 - вид\окна отладки\стек вызовов или простосто ctrl+alt+s в после вылета ты там увидишь цепочку вызовов приведшую к вылету. Соответственно, ты бы сразу понял что вылет при отображении, а не отображается оно потому что оно уничтожено...
Кстати, в первом посте ты нас обманул.
2 - первое предположение - ссылки в массиве на одно и тоже, или nil. ты бы увидел некоторые одинаковые элементы или nil
3 - считай что
if assigned(p)...
и
if p<>nil ...
одно и тоже
соответственно проверяя ты избегаешь действия с уже уничтоженой сущностью
4 думать вокруг них головой. например организовать лог
5 своя


По поводу вышеприведённых объяснений - ГРОМАДНОЕ СПАСИБО, :roll: т.к. теперь мне всё стало: прозрачно, ясно и понятно.

.
Ответить