powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Исключение в MoveTo
25 сообщений из 83, страница 1 из 4
Исключение в MoveTo
    #39596948
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня. Может быть у кого-то будут мысли, почему происходит исключение в такой строке (RootNode, HistoryNode: TTreeNode) :

Код: pascal
1.
RootNode.MoveTo(HistoryNode, naAddChild)



Access violation at address 0000000000D0F2D4 in module 'Project1.exe'. Read of address FFFFFFFFFFFFFFFF.

Код выполняется в Synchronize дополнительного потока.

0000000000D0F280 488B85F0010000 MOV RAX, [RBP+$000001F0]
0000000000D0F287 488B80B8000000 MOV RAX, [RAX+$000000B8]
0000000000D0F28E 488B8838050000 MOV RCX, [RAX+$00000538]
0000000000D0F295 488B85F0010000 MOV RAX, [RBP+$000001F0]
0000000000D0F29C 488B90D0000000 MOV RDX, [RAX+$000000D0]
0000000000D0F2A3 E8C8E8A7FF CALL -$581738 ; ($000000000078DB70) Vcl.TTreeNodes.GetNode
0000000000D0F2A8 488985A0010000 MOV [RBP+$000001A0], RAX
;
; Line=705 - Offset=2703
; ----------------------
0000000000D0F2AF 4883BDA001000000 CMP QWORD PTR [RBP+$000001A0], 0
0000000000D0F2B7 74AD JZ -$53 ; ($0000000000D0F266) EPSessionManager.TEPSessionManager.ProcessEPMessages (Line=703)
;
; Line=706 - Offset=2713
; ----------------------
0000000000D0F2B9 488B85C8010000 MOV RAX, [RBP+$000001C8]
0000000000D0F2C0 488B4028 MOV RAX, [RAX+$28]
0000000000D0F2C4 4889C1 MOV RCX, RAX
0000000000D0F2C7 488B95A0010000 MOV RDX, [RBP+$000001A0]
0000000000D0F2CE 41B002 MOV AL, 2
0000000000D0F2D1 488B18 MOV RBX, [RAX]
;
; Line=706 - Offset=2740
; ----------------------
0000000000D0F2D4 FF5320 CALL QWORD PTR [RBX+$20] ; <-- EXCEPTION


Исключение происходит редко, примерно раз в 3-4 рабочих дня. Программа используется на сервере, чаще всего в удаленной сессии. Вроде бы в момент подключения к сессии проблема случается чаще.
Более глубоко эврика не заходит, несмотря на включенные debug dcu. Я так понимаю, что какая-то из нод становится невалидной. Почему происходит - не ясно.
Операционка - был WS 2003, стал WS2012, на глюк это не повлияло.
Другие части кода, скорее всего, не причастны, так как обработка идёт, в основном, в той процедуре, где случается исключение да и кода относительно немного.
Буду благодарен за идеи.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596950
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonОперационка - был WS 2003, стал WS2012

WS2003 был 64-разрядным ?
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596952
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

32
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596953
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начни с того что залогируй содержимое входных параметров в процедуру.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596959
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon0000000000D0F2D1 488B18 MOV RBX, [RAX]
;
; Line=706 - Offset=2740
; ----------------------
0000000000D0F2D4 FF5320 CALL QWORD PTR [RBX+$20] ; <-- EXCEPTION

Шикарный кусок.
"Если не врёшь" - явная ошибка в компиляторе.

1. Поставь все патчи.
2. Покажи полный кусок кода Дельфи на пару строк до и после
3. Попробуй в этом месте отключить ВСЕ оптимизации, {$O-} и вообще всё, что найдешь.

У тебя очень на то похоже, что RBX = @Self (указатель на VMT) и одновременно RBX = naAddChild
Со всеми вытекающими.

Но какого хрена у тебя идёт вызов Self.MoveTo вметсо RootNode.MoveTo ?...
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596961
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonОперационка - был WS 2003, стал WS2012, на глюк это не повлияло.

Перевод всей программы с 32-бит на 64-бита - не повлиял на глюк?
"Ну не наааюююю...."
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596964
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй сделать локальную процедуру вне всяких классов (прямо в implementation-секции)

типа такой

{$O-} //и м.б. ещё какие-нибудь насйтройки, отключающие лишние куски компилятора
procedure MoveToProxy(const param1: type1; const param2:type2; ....);
var var1: type1; var2:type2; ....
begin
var1 := param1;
var2 := param2;
.....

varN.MoveTo(var1, var2, .... varN-1);
end;

Смысл - убить распихивание переменных по регистрам и навязать их хранение в оперативке на стеке.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596965
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

вот реальный кусок кода (добавил несколько костылей, которые ограниченно помогли):

Код: pascal
1.
2.
3.
4.
5.
6.
          while not Assigned(Node) do
          begin
           FCsNodeIndex := FinHistoryNode;
           Node := FTV.Items.GetNode(FCsNodeIndex);
          end;
          Session.NodeFields.RootNode.MoveTo(Node, naAddChild);



номер последней строки - 706.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596968
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Node - локальная переменная или свойство Self/with ?

заведи локальную переменную RootNodeProxy
RootNodeProxy := Session.NodeFields.RootNode;
RootNodeProxy.MoveTo(Node, naAddChild);

А еще тяжеловеснее - как я выше написал, сделай внешнюю процедуру
makhaon
Код: pascal
1.
2.
3.
          while not Assigned(Node) do
          end;
          MoveToProxy(Node, naAddChild,  Session.NodeFields.RootNode);
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596969
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

авторПеревод всей программы с 32-бит на 64-бита - не повлиял на глюк?
"Ну не наааюююю...."

увы, но нет. валится там же. я на ws2012 32 бита тоже ставил - то же самое.

авторпопробуй сделать локальную процедуру вне всяких классов (прямо в implementation-секции)

спасибо, можно попробовать...
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596970
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где гарантия что у тебя Node - не null?
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596971
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

Node - локальная переменная
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596972
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

обращение по адресу -1 к nil плохо привязывается
если бы было -12 например или другое кратное 4 значение

вариант - он читает неинциализированную память по случайному адресуц и там кто-то зарание забил все пространство -1 чтобы не мусор
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596973
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, не ошибся.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596974
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Не знаю даже. Может она и становится null'ом между концом while'а и, собственно, MoveTo. Вопрос, как такое может случится? Насколько я вижу по коду - весь доступ к TTreeView синхронизирован.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596975
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon32 бита тоже ставил - то же самое.

сравни ассемблерный код 32-битный и 64-битный

например в отладке в View - Debug windows - CPU, чтобы вперемешку шли паскаль и ассемблер


и еще пищи обсуждение багов применительно к твоей версии компилятора
возможно это исправили в патчах или след. версиях
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596976
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,
Попробуй Synchronize на Queue заменить
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596978
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

В коде вроде бы откровенно-космического ничего нет. Обычное гуёвое приложение, менеджер памяти - FastMM, есть несколько потоков. Память и ресурсы потребляет без фанатизма. Ассемблерных вставок, что бы что-то запороть тоже нет. Не понятно, в общем, пока.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596980
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

пробовал :) то же самое.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596982
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon0000000000D0F2CE 41B002 MOV AL, 2
0000000000D0F2D1 488B18 MOV RBX, [RAX]

вот эта хрень выглядит вызывающе, либо дизассемблер убитый в твоей неизвестноей Дельфи, либо одно из двух

перевожу на Паскаль

Код: pascal
1.
2.
3.
4.
5.
6.
var RBX: Int64; 
     RAX: ^Int64; // 64-битный указатель
       AL: byte absolute RAX // первый из 8 байтов указателя
begin
    AL := 2;
    RBX := RAX^;



Может быть это правильный код, сверх-гениальной подмешивание pезультата из "0000000000D0F2C0 488B4028 MOV RAX, [RAX+$28]" - но я сомневаюсь ,выглядит чтение по полу-члучайному полу-мусорному указателю
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596985
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonВ коде вроде бы откровенно-космического ничего нет.

ошибки компилятора никто не отменял

я в Delphi 2.0 и 4.0 например ловил всякое, хотя тоже было совсем ничего кочмического (сортировка пузырьком и вывод окна логин/пароль)
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596989
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

XE6, апдейт стоит.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39596998
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

есть отличный метод: делаешь минимальный воспроизводимый пример и выкладываешь здесь.
Скорее всего, в процессе создания примера ошибку и локализуешь. :)
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39597003
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
41-B0-02 MOV AL, 2
48-8B-18 MOV RBX, [RAX]

http://ref.x86asm.net/coder64.html

41 - Extension of r/m field, base field, or opcode reg field
B0-02 - B0+r MOV r8 imm8

Я не понимаю зачем тут вообще 41, в 32-битном коде должно быть просто B0-02 без левых префиксов

48 - 64 Bit Operand Size
8B-18 - 8B, r MOV r16/32/64 , r/16/32/64 Move
18 вроде бы правильная кодировка пары параметров "RBX, [RAX]" - http://ref.x86asm.net/coder64.html#modrm_byte_32_64

Т.е. дизассемблер вроде бы правилен, в основном, за исключение странного префикса 41

ВОЗМОЖНО там на самом деле команда "MOV R8B, 20" а вовсе не "MOV AL, 02", это было бы гораздо логичнее

А глюков в x64 аcсемблере и дизассемблере у Delphi полно, XE2 был вообще не применим почти

Надо по этому куску проходить в окне CPU Window и смотреть как реально изменяются регистры процессора на каждом шаге.
...
Рейтинг: 0 / 0
Исключение в MoveTo
    #39597006
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем вот этого монстра разрубай на составные части.

через внешнюю процедуру или локальные переменные.

в пределе - не больше одной точки на строчку.

makhaon
Код: pascal
1.
Session.NodeFields.RootNode.MoveTo(
...
Рейтинг: 0 / 0
25 сообщений из 83, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Исключение в MoveTo
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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