Страница 4 из 4

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

СообщениеДобавлено: 25.01.2017 18:30:03
MysticCoder
vitaly_l писал(а):Как обнаружить порчу памяти???


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

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

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

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

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

.

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

СообщениеДобавлено: 25.01.2017 18:54:37
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. Далее уже смотреть, на каком этапе работы программы этот элемент на котором все падает стал таким кривым.

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

СообщениеДобавлено: 25.01.2017 19:10:36
vitaly_l
MysticCoder писал(а):можно "распечатать" массив, как ранее уже предлагали

Я не понимаю, как распечатать массив? Куда нажать, чтобы он "рапечатался" ?

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

СообщениеДобавлено: 25.01.2017 19:16:58
Лекс Айрин
vitaly_l, можно, например, прочитать указатели как числа и вывести их значения, а можно завести метод печатающий содержимое элементов.

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

СообщениеДобавлено: 25.01.2017 20:17:26
beria
vitaly_l писал(а):Я не понимаю, как распечатать массив?



Я лично в подобных спорных случаях всегда присваиваю указателям явно значение ноль и перед удалением смотрю его по Assigned.. Точно также это значение можно вывести и в консоль.

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

СообщениеДобавлено: 25.01.2017 20:40:24
vitaly_l
Отладчик тоже сломался...

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'ом же.

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

СообщениеДобавлено: 25.01.2017 21:01:40
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: ВСЕМ СПАСИБО!!!

.

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

СообщениеДобавлено: 26.01.2017 06:44:41
zub
>>программа пыталась перерисовать экран и взять картинку из битмапов в массиве, но битмапы, к тому времени - уже успевали очистится
А посмотрел бы стек вызовов сразу - всего этого мозголюбви бы небыло. Ну элементарнве та вещи ты должен знать, несмотря на слово от которого происходит твоя профессия))

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

СообщениеДобавлено: 26.01.2017 11:04:46
vitaly_l
zub писал(а):А посмотрел бы стек вызовов сразу

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

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

.

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

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

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

СообщениеДобавлено: 26.01.2017 11:30:50
vitaly_l
zub писал(а):Кстати, в первом посте ты нас обманул.

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

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


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

.