Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 NativeXML ошибка при x64  [new]
amorf2
Member

Откуда:
Сообщений: 161
Откомпилировал свою программу, использующую NativeXML, под x64. У клиента вылазиет такая ошибка:

Access violation at address 000000000040672D in module 'MyApp64.exe'. Write of address FFFFFFFFFFD20020

call stack:
[000000000040672D] System.Move
[0000000000BF8569] NativeXml.sdEscapeString (Line 8231, "NativeXml.pas")
[0000000000BEB9B7] NativeXml.TsdCharData.SetValue (Line 3889, "NativeXml.pas")
[0000000000BEF2AC] NativeXml.TsdElement.SetValue (Line 4771, "NativeXml.pas")
[0000000000BF5359] NativeXml.TNativeXml.NodeNewTextTypeAttr (Line 6879, "NativeXml.pas")
[0000000000BF51F8] NativeXml.TNativeXml.NodeNewText (Line 6784, "NativeXml.pas")
...

Пытаюсь зарегиться на форуме NativeXML, но не одобряют что-то.
Может кто что подсказать по ошибке или написать на их форуме об этом?
29 мар 13, 21:51    [14114941]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
amorf2
Member

Откуда:
Сообщений: 161
Под win32 вроде таких проблем нет.
29 мар 13, 21:52    [14114942]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49387

amorf2
Может кто что подсказать по ошибке или написать на их форуме об этом?

Тебе известно место ошибки с точностью до строки. Что мешает посмотреть что там неправильно?..

Posted via ActualForum NNTP Server 1.5

29 мар 13, 22:00    [14114963]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
amorf2
Member

Откуда:
Сообщений: 161
Dimitry Sibiryakov
amorf2
Может кто что подсказать по ошибке или написать на их форуме об этом?

Тебе известно место ошибки с точностью до строки. Что мешает посмотреть что там неправильно?..

Я честно пытался понять что тут не так на х64, но для меня это так и осталось уличной магией
  // ScratchMem is a TsdFastMemStream
  ScratchMem := TsdFastMemStream.Create(Len * 2);
  try
    P := PAnsiChar(AValue);
    for i := 0 to Len - 1 do
    begin
      case P^ of
      '"'  : ScratchMem.Write(AnsiString('"'), 6);
      '''' : ScratchMem.Write(AnsiString('''), 6);
      '&'  : ScratchMem.Write(AnsiString('&'), 5);
      '<'  : ScratchMem.Write(AnsiString('&lt;'), 4);
      '>'  : ScratchMem.Write(AnsiString('&gt;'), 4);
      else
        ScratchMem.Write(P^, 1);  <<<--- Эта процедура вызывает ошибку
      end;
      Inc(P);
    end;
    SetString(Result, PAnsiChar(ScratchMem.Memory), ScratchMem.Position);
  finally
    ScratchMem.Free;
  end;
29 мар 13, 22:28    [14115036]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49387

amorf2
Эта процедура вызывает ошибку

Call stack из первого сообщения говорит о другом.

Posted via ActualForum NNTP Server 1.5

29 мар 13, 22:43    [14115074]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
amorf2
Member

Откуда:
Сообщений: 161
Dimitry Sibiryakov,

Это часть кода из NativeXml.sdEscapeString, на строке 8231 из NativeXml у меня кокраз ScratchMem.Write(P^, 1)
29 мар 13, 23:01    [14115162]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49387

amorf2
Это часть кода из NativeXml.sdEscapeString, на строке 8231 из NativeXml у
меня кокраз ScratchMem.Write(P^, 1)

Значит копай глубже. В сообщении об ошибке сказано "write", значит ScratchMem пишет мимо
буфера. Len*2 очевидно не хватает.

Posted via ActualForum NNTP Server 1.5

29 мар 13, 23:14    [14115219]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: NativeXML ошибка при x64  [new]
Алексей Колодезный
Member

Откуда:
Сообщений: 71
похоже я тоже наткнулся на эту проблему на 64 bit
Причем возникает только при работе внутри DLL в apache модуле, хрен отладишь :(
6 фев 20, 16:32    [22074927]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
alekcvp
Member

Откуда:
Сообщений: 1861
Алексей Колодезный,

Как я понимаю, надо смотреть в исходники TsdFastMemStream - умеет ли он изменять свои размеры при переполнении.
Если не умеет, то всё очевидно.
Если умеет, то возможно где-то в этом механизме ошибка.

Это при условии что Call Stack у вас такой же.
6 фев 20, 16:40    [22074936]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11503
Здесь очевидная ошибка
amorf2
  ScratchMem := TsdFastMemStream.Create(Len * 2);  // выделяем память в два раза больше от длины строки
  try
    P := PAnsiChar(AValue);
    for i := 0 to Len - 1 do
    begin
      case P^ of
      // Для некоторых символов пишем больше чем 2 байта
      '"'  : ScratchMem.Write(AnsiString('&quot;'), 6);
      '''' : ScratchMem.Write(AnsiString('&apos;'), 6);
      '&'  : ScratchMem.Write(AnsiString('&amp;'), 5);
      '<'  : ScratchMem.Write(AnsiString('&lt;'), 4);
      '>'  : ScratchMem.Write(AnsiString('&gt;'), 4);
      else
        ScratchMem.Write(P^, 1);  // в итоге выделенного размера не хватает
      end;
      Inc(P);
    end;
    SetString(Result, PAnsiChar(ScratchMem.Memory), ScratchMem.Position);
  finally
    ScratchMem.Free;
  end;
6 фев 20, 16:46    [22074946]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
alekcvp
Member

Откуда:
Сообщений: 1861
_Vasilisk_,

С чего вы взяли что внутри .Write() нет чего-то вроде?
if NewSize > Capacity then
  Grow(); 
6 фев 20, 17:08    [22074969]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11503
alekcvp
С чего вы взяли что внутри .Write() нет чего-то вроде?
Вот отсюда
amorf2
ScratchMem := TsdFastMemStream.Create(Len * 2);
при наличии Grow это будет обычный TMemoryStream и тогда двойное резервирование памяти не нужно
6 фев 20, 17:16    [22074976]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11503
alekcvp,

Хотя сейчас
+
function TsdFastMemStream.Write(const Buffer; Count: Integer): Longint;
var
  NewPos: Longint;
begin
  if (FPosition >= 0) and (Count >= 0) then
  begin
    NewPos := FPosition + Count;
    if NewPos > 0 then
    begin
      if NewPos > FSize then
      begin
        if NewPos > FCapacity then
          SetCapacity(NewPos);
        FSize := NewPos;
      end;
      System.Move(Buffer, Pointer(Longint(FMemory) + FPosition)^, Count);
      FPosition := NewPos;
      Result := Count;
      Exit;
    end;
  end;
  Result := 0;
end;
Grow таки есть.

Кстати, вот и ошибка
System.Move(Buffer, Pointer(Longint(FMemory) + FPosition)^, Count);
Оптимизаторы, блин

Сообщение было отредактировано: 6 фев 20, 17:24
6 фев 20, 17:23    [22074982]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
alekcvp
Member

Откуда:
Сообщений: 1861
_Vasilisk_
при наличии Grow это будет обычный TMemoryStream и тогда двойное резервирование памяти не нужно

Двойное резервирование памяти ускоряет работу и уменьшает фрагментацию этой памяти...

_Vasilisk_
Кстати, вот и ошибка
System.Move(Buffer, Pointer(Longint(FMemory) + FPosition)^, Count);
Оптимизаторы, блин

Судя по Longint() этот код тянется ещё с какой-нибудь Delphi 2 и про x64 тогда ещё никто и не задумывался :)
6 фев 20, 17:29    [22074987]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11503
alekcvp
Двойное резервирование памяти ускоряет работу и уменьшает фрагментацию этой памяти...
Тогда банально
LStrm := TMemoryStream.Create;
LStrm.Size := ....
но нужен был свой класс со своими багами :)
6 фев 20, 17:33    [22074992]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11503
alekcvp
Судя по Longint() этот код тянется ещё с какой-нибудь Delphi 2 и про x64 тогда ещё никто и не задумывался :)
А сишники сразу ввели тип INT_PTR и ни о чем не думали
6 фев 20, 17:35    [22074996]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49387

_Vasilisk_
А сишники сразу ввели тип INT_PTR

Не сразу, далеко не сразу. Но в данном конкретном случае они сразу ввели адресную
арифметику и INT_PTR им был не нужен по определению.

Posted via ActualForum NNTP Server 1.5

6 фев 20, 17:36    [22074998]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
alekcvp
Member

Откуда:
Сообщений: 1861
Dimitry Sibiryakov

_Vasilisk_
А сишники сразу ввели тип INT_PTR

Не сразу, далеко не сразу. Но в данном конкретном случае они сразу ввели адресную
арифметику и INT_PTR им был не нужен по определению.

Конструкция ниже работает даже в Delphi 2, если что:
System.Move(Buffer, (PAnsiChar(FMemory) + FPosition)^, Count);
6 фев 20, 17:44    [22075010]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2251
Откуда у народа такая привычка кастить бинарные данные к PAnsiChar? Чем PByte не угодил?
16 фев 20, 15:26    [22080741]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
white_nigger
Откуда у народа такая привычка кастить бинарные данные к PAnsiChar? Чем PByte не угодил?

Тем, что c PByte без поддержки $POINTERMATH обламаешься, а с PAnsiChar нет. Для дельфей 2009 и старше не актуально, разумеется.
16 фев 20, 15:53    [22080751]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2251
Kazantsev Alexey, да и раньше Inc, Dec с типизированными поинтерами нормально работали и в квадратные скобки вычисляемое смещение всегда подсунуть можно
16 фев 20, 23:11    [22080887]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
asviridenkov
Member

Откуда:
Сообщений: 3975
white_nigger,

Насколько помню, у FPC inc на типизированном поинтере его на 1 увеличивал, а не на sizeof.
16 фев 20, 23:26    [22080891]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2251
asviridenkov, здесь я не в курсе
16 фев 20, 23:29    [22080893]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
white_nigger,

Вот только в выражениях Inc/Dec нельзя использовать.
17 фев 20, 00:15    [22080918]     Ответить | Цитировать Сообщить модератору
 Re: NativeXML ошибка при x64  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4088
asviridenkov
Насколько помню, у FPC inc на типизированном поинтере его на 1 увеличивал, а не на sizeof

Может на старых, сейчас нормально.
17 фев 20, 00:32    [22080921]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить