|
|
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня. Может быть у кого-то будут мысли, почему происходит исключение в такой строке (RootNode, HistoryNode: TTreeNode) : Код: pascal 1. 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, на глюк это не повлияло. Другие части кода, скорее всего, не причастны, так как обработка идёт, в основном, в той процедуре, где случается исключение да и кода относительно немного. Буду благодарен за идеи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:12 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
makhaonОперационка - был WS 2003, стал WS2012 WS2003 был 64-разрядным ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:15 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
Начни с того что залогируй содержимое входных параметров в процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:15 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
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 ?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:20 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
makhaonОперационка - был WS 2003, стал WS2012, на глюк это не повлияло. Перевод всей программы с 32-бит на 64-бита - не повлиял на глюк? "Ну не наааюююю...." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:21 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
попробуй сделать локальную процедуру вне всяких классов (прямо в 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; Смысл - убить распихивание переменных по регистрам и навязать их хранение в оперативке на стеке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:25 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
Arioch, вот реальный кусок кода (добавил несколько костылей, которые ограниченно помогли): Код: pascal 1. 2. 3. 4. 5. 6. номер последней строки - 706. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:25 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
makhaon, Node - локальная переменная или свойство Self/with ? заведи локальную переменную RootNodeProxy RootNodeProxy := Session.NodeFields.RootNode; RootNodeProxy.MoveTo(Node, naAddChild); А еще тяжеловеснее - как я выше написал, сделай внешнюю процедуру makhaon Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:28 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
Arioch, авторПеревод всей программы с 32-бит на 64-бита - не повлиял на глюк? "Ну не наааюююю...." увы, но нет. валится там же. я на ws2012 32 бита тоже ставил - то же самое. авторпопробуй сделать локальную процедуру вне всяких классов (прямо в implementation-секции) спасибо, можно попробовать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:29 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
Где гарантия что у тебя Node - не null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:30 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
Arioch, Node - локальная переменная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:30 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
rgreat, обращение по адресу -1 к nil плохо привязывается если бы было -12 например или другое кратное 4 значение вариант - он читает неинциализированную память по случайному адресуц и там кто-то зарание забил все пространство -1 чтобы не мусор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:31 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
rgreat, Не знаю даже. Может она и становится null'ом между концом while'а и, собственно, MoveTo. Вопрос, как такое может случится? Насколько я вижу по коду - весь доступ к TTreeView синхронизирован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:33 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
makhaon32 бита тоже ставил - то же самое. сравни ассемблерный код 32-битный и 64-битный например в отладке в View - Debug windows - CPU, чтобы вперемешку шли паскаль и ассемблер и еще пищи обсуждение багов применительно к твоей версии компилятора возможно это исправили в патчах или след. версиях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:33 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
makhaon, Попробуй Synchronize на Queue заменить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:34 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
Arioch, В коде вроде бы откровенно-космического ничего нет. Обычное гуёвое приложение, менеджер памяти - FastMM, есть несколько потоков. Память и ресурсы потребляет без фанатизма. Ассемблерных вставок, что бы что-то запороть тоже нет. Не понятно, в общем, пока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:36 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
white_nigger, пробовал :) то же самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:37 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
makhaon0000000000D0F2CE 41B002 MOV AL, 2 0000000000D0F2D1 488B18 MOV RBX, [RAX] вот эта хрень выглядит вызывающе, либо дизассемблер убитый в твоей неизвестноей Дельфи, либо одно из двух перевожу на Паскаль Код: pascal 1. 2. 3. 4. 5. 6. Может быть это правильный код, сверх-гениальной подмешивание pезультата из "0000000000D0F2C0 488B4028 MOV RAX, [RAX+$28]" - но я сомневаюсь ,выглядит чтение по полу-члучайному полу-мусорному указателю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:39 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
makhaonВ коде вроде бы откровенно-космического ничего нет. ошибки компилятора никто не отменял я в Delphi 2.0 и 4.0 например ловил всякое, хотя тоже было совсем ничего кочмического (сортировка пузырьком и вывод окна логин/пароль) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:40 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
Arioch, XE6, апдейт стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:44 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
makhaon, есть отличный метод: делаешь минимальный воспроизводимый пример и выкладываешь здесь. Скорее всего, в процессе создания примера ошибку и локализуешь. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:53 |
|
||
|
Исключение в MoveTo
|
|||
|---|---|---|---|
|
#18+
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 и смотреть как реально изменяются регистры процессора на каждом шаге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 17:56 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39596952&tid=2041182]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
82ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 437ms |

| 0 / 0 |
