Страница 4 из 4
Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т
Добавлено: 25.01.2017 17:30:03
MysticCoder
vitaly_l писал(а):Как обнаружить порчу памяти???
стать избранным, посвященным в таинства древнего и почти забытого ритуала отладки
Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т
Добавлено: 25.01.2017 17:45:56
vitaly_l
MysticCoder писал(а):стать избранным, посвященным в таинства древнего и почти забытого ритуала отладки
Я готов, стать посвящённым, т.к. по прежнему работает только метод предложенный Пупсиком. Метод мне нравится, но краешком мозга я понимаю, что проблема - где-то висит в виде хитрого бага. И от бага нужно избавится.
Можно меня посвятить в двух трёх словах в магический забытый всеми ритуал отладки?

Что для этого нужно и каков порядок действий?
.
Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т
Добавлено: 25.01.2017 17: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 18:10:36
vitaly_l
MysticCoder писал(а):можно "распечатать" массив, как ранее уже предлагали
Я не понимаю, как распечатать массив? Куда нажать, чтобы он "рапечатался" ?
Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т
Добавлено: 25.01.2017 18:16:58
Лекс Айрин
vitaly_l, можно, например, прочитать указатели как числа и вывести их значения, а можно завести метод печатающий содержимое элементов.
Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т
Добавлено: 25.01.2017 19:17:26
beria
vitaly_l писал(а):Я не понимаю, как распечатать массив?
Я лично в подобных спорных случаях всегда присваиваю указателям явно значение ноль и перед удалением смотрю его по Assigned.. Точно также это значение можно вывести и в консоль.
Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т
Добавлено: 25.01.2017 19:40:24
vitaly_l
Отладчик тоже сломался...
Re: (решено на 55%) SIGSEGV do arrBitmap[b].Free; - что не т
Добавлено: 25.01.2017 19: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 20: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, который запрещает перерисовку при закрытии и теперь всё работает безупречно, как в не-швейцарских часах, что висят в кабине пилота, на межгалактическом галактикалёте, который сотворил Землю и остальное, многообразие видов.
Но различные способы отладки, по прежнему - интересны, особенно с примерами, как показал: добрый и мульти-уважаемый Дож.
ВСЕМ СПАСИБО!!! .
Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 26.01.2017 05:44:41
zub
>>программа пыталась перерисовать экран и взять картинку из битмапов в массиве, но битмапы, к тому времени - уже успевали очистится
А посмотрел бы стек вызовов сразу - всего этого мозголюбви бы небыло. Ну элементарнве та вещи ты должен знать, несмотря на слово от которого происходит твоя профессия))
Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?
Добавлено: 26.01.2017 10: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 10: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 10:30:50
vitaly_l
zub писал(а):Кстати, в первом посте ты нас обманул.
Скорее себя, т.к. был уверен, что сбой в массиве, потому что, на массив показывал Лазарус и и говорил, мне, что там SIGSEGV.
zub писал(а):1 - вид\окна отладки\стек вызовов или простосто ctrl+alt+s в после вылета ты там увидишь цепочку вызовов приведшую к вылету. Соответственно, ты бы сразу понял что вылет при отображении, а не отображается оно потому что оно уничтожено...
Кстати, в первом посте ты нас обманул.
2 - первое предположение - ссылки в массиве на одно и тоже, или nil. ты бы увидел некоторые одинаковые элементы или nil
3 - считай что
if assigned(p)...
и
if p<>nil ...
одно и тоже
соответственно проверяя ты избегаешь действия с уже уничтоженой сущностью
4 думать вокруг них головой. например организовать лог
5 своя
По поводу вышеприведённых объяснений - ГРОМАДНОЕ СПАСИБО,

т.к. теперь мне всё стало: прозрачно, ясно и понятно.
.