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

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

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

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение MysticCoder » 25.01.2017 18:30:03

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


стать избранным, посвященным в таинства древнего и почти забытого ритуала отладки
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение vitaly_l » 25.01.2017 18:45:56

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

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

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

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение MysticCoder » 25.01.2017 18:54:37

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. Далее уже смотреть, на каком этапе работы программы этот элемент на котором все падает стал таким кривым.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение vitaly_l » 25.01.2017 19:10:36

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

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

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение Лекс Айрин » 25.01.2017 19:16:58

vitaly_l, можно, например, прочитать указатели как числа и вывести их значения, а можно завести метод печатающий содержимое элементов.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение beria » 25.01.2017 20:17:26

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



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

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение vitaly_l » 25.01.2017 20:40:24

Отладчик тоже сломался...
Вложения
error_otlad.jpg
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение Дож » 25.01.2017 20:46:09

Код: Выделить всё
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'ом же.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т

Сообщение vitaly_l » 25.01.2017 21:01:40

Дож писал(а):Обычная ситуация для программы с 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: ВСЕМ СПАСИБО!!!

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 26.01.2017 06:44:41

>>программа пыталась перерисовать экран и взять картинку из битмапов в массиве, но битмапы, к тому времени - уже успевали очистится
А посмотрел бы стек вызовов сразу - всего этого мозголюбви бы небыло. Ну элементарнве та вещи ты должен знать, несмотря на слово от которого происходит твоя профессия))
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 26.01.2017 11:04:46

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

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

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

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 26.01.2017 11:22:15

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

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

Сообщение vitaly_l » 26.01.2017 11:30:50

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

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

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


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

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru