Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / NativeXML ошибка при x64 / 25 сообщений из 31, страница 1 из 2
29.03.2013, 21:51
    #38205067
amorf2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Откомпилировал свою программу, использующую 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, но не одобряют что-то.
Может кто что подсказать по ошибке или написать на их форуме об этом?
...
Рейтинг: 0 / 0
29.03.2013, 21:52
    #38205068
amorf2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Под win32 вроде таких проблем нет.
...
Рейтинг: 0 / 0
29.03.2013, 22:00
    #38205075
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
amorf2Может кто что подсказать по ошибке или написать на их форуме об этом?

Тебе известно место ошибки с точностью до строки. Что мешает посмотреть что там неправильно?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.03.2013, 22:28
    #38205099
amorf2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Dimitry Sibiryakovamorf2Может кто что подсказать по ошибке или написать на их форуме об этом?

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

Я честно пытался понять что тут не так на х64, но для меня это так и осталось уличной магией
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  // 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;
...
Рейтинг: 0 / 0
29.03.2013, 22:43
    #38205114
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
amorf2Эта процедура вызывает ошибку
Call stack из первого сообщения говорит о другом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.03.2013, 23:01
    #38205124
amorf2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Dimitry Sibiryakov,

Это часть кода из NativeXml.sdEscapeString, на строке 8231 из NativeXml у меня кокраз ScratchMem.Write(P^, 1)
...
Рейтинг: 0 / 0
29.03.2013, 23:14
    #38205139
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
amorf2Это часть кода из NativeXml.sdEscapeString, на строке 8231 из NativeXml у
меня кокраз ScratchMem.Write(P^, 1)
Значит копай глубже. В сообщении об ошибке сказано "write", значит ScratchMem пишет мимо
буфера. Len*2 очевидно не хватает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.02.2020, 16:32
    #39923533
NativeXML ошибка при x64
похоже я тоже наткнулся на эту проблему на 64 bit
Причем возникает только при работе внутри DLL в apache модуле, хрен отладишь :(
...
Рейтинг: 0 / 0
06.02.2020, 16:40
    #39923540
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Алексей Колодезный,

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

Это при условии что Call Stack у вас такой же.
...
Рейтинг: 0 / 0
06.02.2020, 16:46
    #39923546
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Здесь очевидная ошибка
amorf2
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  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;

...
Рейтинг: 0 / 0
06.02.2020, 17:08
    #39923559
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
_Vasilisk_,

С чего вы взяли что внутри .Write() нет чего-то вроде?
Код: pascal
1.
2.
if NewSize > Capacity then
  Grow(); 
...
Рейтинг: 0 / 0
06.02.2020, 17:16
    #39923564
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
alekcvp
С чего вы взяли что внутри .Write() нет чего-то вроде?
Вот отсюда
amorf2
Код: pascal
1.
ScratchMem := TsdFastMemStream.Create(Len * 2);

при наличии Grow это будет обычный TMemoryStream и тогда двойное резервирование памяти не нужно
...
Рейтинг: 0 / 0
06.02.2020, 17:23
    #39923567
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
alekcvp,

Хотя сейчас
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 таки есть.

Кстати, вот и ошибка
Код: pascal
1.
System.Move(Buffer, Pointer(Longint(FMemory) + FPosition)^, Count);

Оптимизаторы, блин
...
Рейтинг: 0 / 0
06.02.2020, 17:29
    #39923569
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
_Vasilisk_
при наличии Grow это будет обычный TMemoryStream и тогда двойное резервирование памяти не нужно

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

_Vasilisk_
Кстати, вот и ошибка
Код: pascal
1.
System.Move(Buffer, Pointer(Longint(FMemory) + FPosition)^, Count);

Оптимизаторы, блин

Судя по Longint() этот код тянется ещё с какой-нибудь Delphi 2 и про x64 тогда ещё никто и не задумывался :)
...
Рейтинг: 0 / 0
06.02.2020, 17:33
    #39923572
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
alekcvp
Двойное резервирование памяти ускоряет работу и уменьшает фрагментацию этой памяти...
Тогда банально
Код: pascal
1.
2.
LStrm := TMemoryStream.Create;
LStrm.Size := ....

но нужен был свой класс со своими багами :)
...
Рейтинг: 0 / 0
06.02.2020, 17:35
    #39923576
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
alekcvp
Судя по Longint() этот код тянется ещё с какой-нибудь Delphi 2 и про x64 тогда ещё никто и не задумывался :)
А сишники сразу ввели тип INT_PTR и ни о чем не думали
...
Рейтинг: 0 / 0
06.02.2020, 17:36
    #39923578
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
_Vasilisk_А сишники сразу ввели тип INT_PTR

Не сразу, далеко не сразу. Но в данном конкретном случае они сразу ввели адресную
арифметику и INT_PTR им был не нужен по определению.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.02.2020, 17:44
    #39923585
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Dimitry Sibiryakov

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

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

Конструкция ниже работает даже в Delphi 2, если что:
Код: pascal
1.
System.Move(Buffer, (PAnsiChar(FMemory) + FPosition)^, Count);
...
Рейтинг: 0 / 0
16.02.2020, 15:26
    #39927178
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Откуда у народа такая привычка кастить бинарные данные к PAnsiChar? Чем PByte не угодил?
...
Рейтинг: 0 / 0
16.02.2020, 15:53
    #39927184
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
white_nigger
Откуда у народа такая привычка кастить бинарные данные к PAnsiChar? Чем PByte не угодил?

Тем, что c PByte без поддержки $POINTERMATH обламаешься, а с PAnsiChar нет. Для дельфей 2009 и старше не актуально, разумеется.
...
Рейтинг: 0 / 0
16.02.2020, 23:11
    #39927233
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
Kazantsev Alexey, да и раньше Inc, Dec с типизированными поинтерами нормально работали и в квадратные скобки вычисляемое смещение всегда подсунуть можно
...
Рейтинг: 0 / 0
16.02.2020, 23:26
    #39927234
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
white_nigger,

Насколько помню, у FPC inc на типизированном поинтере его на 1 увеличивал, а не на sizeof.
...
Рейтинг: 0 / 0
16.02.2020, 23:29
    #39927235
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
asviridenkov, здесь я не в курсе
...
Рейтинг: 0 / 0
17.02.2020, 00:15
    #39927240
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
white_nigger,

Вот только в выражениях Inc/Dec нельзя использовать.
...
Рейтинг: 0 / 0
17.02.2020, 00:32
    #39927242
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NativeXML ошибка при x64
asviridenkov
Насколько помню, у FPC inc на типизированном поинтере его на 1 увеличивал, а не на sizeof

Может на старых, сейчас нормально.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / NativeXML ошибка при x64 / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]