Сброс регистров при обработке отладочного исключения

Тема в разделе "WASM.X64", создана пользователем ormoulu, 8 дек 2022.

  1. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    По ходу дела обнаружилось кое-что для меня новое.

    Во-первых, Windbg x64 не поддерживает ассемблирование x64 и не планирует этого делать. Ну с этим отношением от M$ давно все понятно.

    Во-вторых, оказывается, если общесистемный отладчик (который postmortem) поймал приложение с исключением, в том числе отладочным, то перед выполнением следующего опкода регистры rbx, rdi, rsi вернутся в состояние на момент исключения.
    Примерно так:
    Код (Text):
    1. test64+0x100e:
    2. 00007ff6`710d100e cc              int     3
    3. 0:000> e rip 90
    4. 0:000> r
    5. rax=000000000000000a rbx=000000000000000b rcx=0000009c764b0000
    6. rdx=00007ff6710d1000 rsi=0000000000000000 rdi=0000000000000000
    7. rip=00007ff6710d100e rsp=0000009c763afef8 rbp=0000000000000000
    8. r8=0000009c764b0000  r9=00007ff6710d1000 r10=0000000000000000
    9. r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
    10. r14=0000000000000000 r15=0000000000000000
    11. iopl=0         nv up ei pl zr na po nc
    12. cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000244
    13. test64+0x100e:
    14. 00007ff6`710d100e 90              nop
    15. 0:000> r rbx=AAAA
    16. 0:000> r rsi=BBBB
    17. 0:000> r rdi=CCCC
    18. 0:000> r
    19. rax=000000000000000a rbx=000000000000aaaa rcx=0000009c764b0000
    20. rdx=00007ff6710d1000 rsi=000000000000bbbb rdi=000000000000cccc
    21. rip=00007ff6710d100e rsp=0000009c763afef8 rbp=0000000000000000
    22. r8=0000009c764b0000  r9=00007ff6710d1000 r10=0000000000000000
    23. r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
    24. r14=0000000000000000 r15=0000000000000000
    25. iopl=0         nv up ei pl zr na po nc
    26. cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000244
    27. test64+0x100e:
    28. 00007ff6`710d100e 90              nop
    29. 0:000> tr
    30. rax=000000000000000a rbx=000000000000000b rcx=0000009c764b0000
    31. rdx=00007ff6710d1000 rsi=0000000000000000 rdi=0000000000000000
    32. rip=00007ff6710d100f rsp=0000009c763afef8 rbp=0000000000000000
    33. r8=0000009c764b0000  r9=00007ff6710d1000 r10=0000000000000000
    34. r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
    35. r14=0000000000000000 r15=0000000000000000
    36. iopl=0         nv up ei pl zr na po nc
    37. cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
    38. test64+0x100f:
    39. 00007ff6`710d100f 4803c3          add     rax,rbx
    Интересно почему так. Похоже на какой-то обработчик, который сохраняет только регистры которые требуются по стандарту, но вдруг кто в курсе подробностей.