Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
amorf2 Member Откуда: Сообщений: 161 |
Под win32 вроде таких проблем нет. |
29 мар 13, 21:52 [14114942] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52442 |
Тебе известно место ошибки с точностью до строки. Что мешает посмотреть что там неправильно?.. Posted via ActualForum NNTP Server 1.5 |
||
29 мар 13, 22:00 [14114963] Ответить | Цитировать Сообщить модератору |
amorf2 Member Откуда: Сообщений: 161 |
Я честно пытался понять что тут не так на х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('<'), 4); '>' : ScratchMem.Write(AnsiString('>'), 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] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52442 |
Call stack из первого сообщения говорит о другом. Posted via ActualForum NNTP Server 1.5 |
||
29 мар 13, 22:43 [14115074] Ответить | Цитировать Сообщить модератору |
amorf2 Member Откуда: Сообщений: 161 |
Dimitry Sibiryakov, Это часть кода из NativeXml.sdEscapeString, на строке 8231 из NativeXml у меня кокраз ScratchMem.Write(P^, 1) |
29 мар 13, 23:01 [14115162] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52442 |
Значит копай глубже. В сообщении об ошибке сказано "write", значит ScratchMem пишет мимо буфера. Len*2 очевидно не хватает. Posted via ActualForum NNTP Server 1.5 |
||
29 мар 13, 23:14 [14115219] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
Алексей Колодезный Member Откуда: Сообщений: 73 |
похоже я тоже наткнулся на эту проблему на 64 bit Причем возникает только при работе внутри DLL в apache модуле, хрен отладишь :( |
6 фев 20, 16:32 [22074927] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
Алексей Колодезный, Как я понимаю, надо смотреть в исходники TsdFastMemStream - умеет ли он изменять свои размеры при переполнении. Если не умеет, то всё очевидно. Если умеет, то возможно где-то в этом механизме ошибка. Это при условии что Call Stack у вас такой же. |
6 фев 20, 16:40 [22074936] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12569 |
Здесь очевидная ошибка
|
||||
6 фев 20, 16:46 [22074946] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
_Vasilisk_, С чего вы взяли что внутри .Write() нет чего-то вроде? if NewSize > Capacity then Grow(); |
6 фев 20, 17:08 [22074969] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12569 |
|
||||||||
6 фев 20, 17:16 [22074976] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12569 |
alekcvp, Хотя сейчас
Кстати, вот и ошибка
System.Move(Buffer, Pointer(Longint(FMemory) + FPosition)^, Count);
Оптимизаторы, блин
Сообщение было отредактировано: 6 фев 20, 17:24 |
|
6 фев 20, 17:23 [22074982] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
Двойное резервирование памяти ускоряет работу и уменьшает фрагментацию этой памяти...
Судя по Longint() этот код тянется ещё с какой-нибудь Delphi 2 и про x64 тогда ещё никто и не задумывался :) |
||||||||
6 фев 20, 17:29 [22074987] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12569 |
LStrm := TMemoryStream.Create; LStrm.Size := ....но нужен был свой класс со своими багами :) |
||||
6 фев 20, 17:33 [22074992] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12569 |
|
||||
6 фев 20, 17:35 [22074996] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52442 |
Не сразу, далеко не сразу. Но в данном конкретном случае они сразу ввели адресную арифметику и INT_PTR им был не нужен по определению. Posted via ActualForum NNTP Server 1.5 |
||
6 фев 20, 17:36 [22074998] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
Конструкция ниже работает даже в Delphi 2, если что: System.Move(Buffer, (PAnsiChar(FMemory) + FPosition)^, Count); |
||||||
6 фев 20, 17:44 [22075010] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 2469 |
Откуда у народа такая привычка кастить бинарные данные к PAnsiChar? Чем PByte не угодил? |
16 фев 20, 15:26 [22080741] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Тем, что c PByte без поддержки $POINTERMATH обламаешься, а с PAnsiChar нет. Для дельфей 2009 и старше не актуально, разумеется. |
||||
16 фев 20, 15:53 [22080751] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 2469 |
Kazantsev Alexey, да и раньше Inc, Dec с типизированными поинтерами нормально работали и в квадратные скобки вычисляемое смещение всегда подсунуть можно |
16 фев 20, 23:11 [22080887] Ответить | Цитировать Сообщить модератору |
asviridenkov Member Откуда: Сообщений: 4028 |
white_nigger, Насколько помню, у FPC inc на типизированном поинтере его на 1 увеличивал, а не на sizeof. |
16 фев 20, 23:26 [22080891] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 2469 |
asviridenkov, здесь я не в курсе |
16 фев 20, 23:29 [22080893] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
white_nigger, Вот только в выражениях Inc/Dec нельзя использовать. |
17 фев 20, 00:15 [22080918] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Может на старых, сейчас нормально. |
||||
17 фев 20, 00:32 [22080921] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |