Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2019, 18:09   #1
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию Отладка ошибок Access violation

Как отлаживать такие вот ошибки? Ошибка возникает на 5 минуте.


Судя по всему ошибка связано с полосой по середине.


Я предположил, что ошибка здесь.
Код:
procedure AlphaBlending(var BG:TByteMap; x,y:Integer; FG:TByteMap);
var y0,y1:Integer;
var x0,x1:Integer;
var i,ii,j,jj:Integer;
BG_Color, FG_Color, Color:TBGRA;
BG_Color3:TBGR;
begin
ii:=0; jj:=0;
y0:=y;
if y0<0 then
  begin
   y0:=0;
   ii:=-y;
  end;


y1:=y+FG.Height-1;
if y1>=Bg.Height then y1:=Bg.Height-1;

x0:=x;
if x0<0 then
  begin
    x0:=0;
  end;
x1:=x+FG.Width-1;
if x1>=Bg.Width then x1:=Bg.Width-1;

if BG.UnitFormat=uf3Unit then
  begin
  for i:=y0 to y1 do
   if (0<=ii) and (ii<FG.Height) then
   begin
   if x<0 then jj:=-x else jj:=0;
   for j:=x0 to x1 do
    if (0<=jj) and (jj<FG.Width) then
     begin
     FG_Color:=FG.GetPixel4(jj,ii);
     BG_Color3:=BG.GetPixel3(j,i);
     BG_Color.b:=BG_Color3.b;
     BG_Color.g:=BG_Color3.g;
     BG_Color.r:=BG_Color3.r;
     BG_Color.a:=255;
     Color:=AlfaBland(FG_Color,BG_Color);
     BG_Color3.b:=Color.b;
     BG_Color3.g:=Color.g;
     BG_Color3.r:=Color.r;
     BG.SetPixel3(j,i, BG_Color3);
     inc(jj);
     end else inc(jj);
   inc(ii);
   end else  inc(ii);
  end;
if BG.UnitFormat=uf4Unit then
  begin
  for i:=y0 to y1 do
   if (0<=ii) and (ii<FG.Height) then
   begin
   if x<0 then jj:=-x else jj:=0;
   for j:=x0 to x1 do
    if (0<=jj) and (jj<FG.Width) then
     begin
     FG_Color:=FG.GetPixel4(jj,ii);
     BG_Color:=BG.GetPixel4(j,i);
     Color:=AlfaBland(FG_Color,BG_Color);
     BG.SetPixel4(j,i, Color);
     inc(jj);
     end else inc(jj);
   inc(ii);
   end else inc(ii);
  end;
end;
Но здесь её не видно.

Собственно как локализовать ошибку? Второе предположение было что закончилась память, но вроде бы нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.10.2019, 18:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Можно в лог писать в разных местах для локализации участка возникновения ошибки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.10.2019, 20:13   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Я предположил, что ошибка здесь.
так вроде есть-же адрес глючной инструкции 00401DE5 на скрине - поставить на неё бряк и всё. Или этот адрес меняется каждый раз?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 19.10.2019, 21:00   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Аватар
Я хочу учится новому. Хочу через бряки докопаться до правды. Если не получится тогда буду лог делать.

R71MT
Адрес инструкции постоянный. Бряк поставил. Эта инструкция внутри менеджера памяти.
Код:
function FillerSizeAfterGap(a: PChar): Integer;
var
  sizeFlags: Integer;
  f : PFree;
begin
  result := 0;
  sizeFlags := PUsed(a).sizeFlags;
  if (sizeFlags and cFillerFlag) <> 0 then begin
    sizeFlags := sizeFlags and not cFlags;
    Inc(result,sizeFlags);
    Inc(a, sizeFlags);
    sizeFlags := PUsed(a).sizeFlags; // Тут вылетает
  end;
Что дальше? Указатель "a" имеет каждый раз разный адрес. Как бы понятно что текут указатели, но как вычислить где протечка?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.10.2019, 21:41   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Черная полоса не связана с выходом, за с утечкой указателей(индексов).
Можно считать что логи тоже дали отрицательный результат.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 20.10.2019, 05:51   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Эта инструкция внутри менеджера памяти.
я бы сказал, что это ваша инструкция обращается напрямую к менеджеру памяти, чего делать нельзя и guard (в данном случае) этому препятствует. На скрине говорится, что инструкция 0x0040xxxx обратилась к памяти 0x80xxxxxx. Регион памяти от нуля и до 0х7FFFFFFF принадлежит вашей программе, а от 0x80000000 и выше - это уже системная. Поэтому 0x00401DE5 это адрес внутри вашей программы.

"Access Violation" имеет код-ошибки 0хС0000005 и указывает на то, что программа пытается прочитать не доступный ей адрес. Я бы поставил точку-останова на адрес ДО глючной инструкции, например 0x00401D00 или ещё раньше. Теперь в отладчике смотрите, что (и почему) лежит в регистрах, которые обращаются к системной памяти. По отпечатку своего кода вы легко локализуете проблему.

А вообще для отлова блох хорошо помогают пользовательские "обработчики структурных исключений SEH". В ассемблере вручную их создаём, а в ЯВУ вроде оператор _try. Когда возникает исключение, то обработчик перехватывает его и в нашем распоряжении оказывается весь контекст регистров (структура CONTEXT в стеке по смещению ESP+0Ch). Мы можем подменить в этом контексте значение регистра EIP и возвратить управление опять нашей программе. Но это в критических случаях..

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

Последний раз редактировалось R71MT; 20.10.2019 в 05:55.
R71MT вне форума Ответить с цитированием
Старый 20.10.2019, 06:00   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

кстати какая система? можно будет в отладчике WinDbg посмотреть, кому принадлежит адрес 0х8018276С - скорей всего это не диспетчер памяти, а обработчик исключений RaiseExeption(). Если это действительно он, то круг подозреваемых сузится, и проблема может быть вообще не в том месте, на который указывает скрин.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 20.10.2019, 10:12   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
а от 0x80000000 и выше - это уже системная.
У меня флаг 3G включен {$SetPEFlags $20}
Так что первые 3ГБ принадлежат мне.

Цитата:
Сообщение от R71MT Посмотреть сообщение
Попробуйте вставить _try в каждый подозреваемый блок, и в обработчиках выводите разные сообщения - это конкретно выявит причину.
Попробовал не помогло.
Решил закомментировать подозрительные функции не помогло. Это уже интересно. Значит ошибка где-то ещё.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 20.10.2019, 22:30   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Нашел ошибку. Так как ошибка явна была связанна с границей в 2ГБ пришлось пересобрать код под 64 бита, там она не исчезла. Отключил всё лишнее и там догадался что у меня integer вместо NativInt,

Код:
GetMem(p,LineLen*NewHeight+MyAlign-1);
Map:=Pointer((IntegerNativeUInt(p)+MyAlign-1) and not (MyAlign-1));
Но тут лучше NativeUInt
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 21.10.2019, 06:52   #10
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
А вообще для отлова блох хорошо помогают пользовательские "обработчики структурных исключений SEH". В ассемблере вручную их создаём, а в ЯВУ вроде оператор _try. Когда возникает исключение, то обработчик перехватывает его и в нашем распоряжении оказывается весь контекст регистров
можно так:

Код:
  public
      { Public declarations }
    procedure GlobalException(sender: Tobject; Ex: Exception);

//////////////////////////////////////////////////////////////////////
procedure TProject.GlobalException(sender: Tobject; Ex: Exception);
begin
Exit;
ShowMessage('ErrorEx' + Ex.ClassName + ':' + Ex.Message +#13#10'End');
end;
и так:

Код:
    public
      { Public declarations }
      procedure LocalExExcept(Sender:TObject; E:Exception);

///////////////////////////////////////////////////////////////////
procedure TProject.LocalExExcept(Sender:TObject; E:Exception);
begin
  if E is EInOutError then
    Exit
  else
  if E is EOSError then
    Exit
  else
  if E is EPackageError then
    Exit
  else
  if E is EInvalidInsert then
    Exit
  else
  if E is EIntfCastError then
    Exit
  else
  if E is EAbstractError then
    Exit
  else
  if E is EVariantError then
    Exit
    else
  if E is EConvertError then
    Exit
  else
  if E is EIntError then
    Exit;
end;

Последний раз редактировалось beegl; 21.10.2019 в 06:55. Причина: Add text
beegl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access violation Vanta11a C++ Builder 4 12.04.2013 18:14
Access violation dimavit Общие вопросы Delphi 3 29.07.2012 19:16
access violation ho_N Компьютерное железо 2 30.11.2011 08:36
Поиск ошибок, отладка стиля макета CocoDen HTML и CSS 5 24.05.2011 02:48
Access Violation Carbon Общие вопросы Delphi 12 18.09.2007 19:55