не врубаюсь...
Почему в асм варианте - колстек ломается, а в чисто-паскалевском - не ломается?
Смотрю твоим PMM, когда стоим на бряке в test2
асм код в асм-варианте скопипастил подчистую из выхлопа паскаль варианта
т.е. код вроде как тоже 1 к 1
Win x64, FPC Trunk, -O1, x64
асм вариант
program stackframe_test_asm;
{$asmmode intel}
procedure test2;
var
f: array [0..20] of pointer;
begin
WriteLn(CaptureBacktrace(0, 20, @f[0])); // > 2
end;
procedure test1; assembler; nostackframe;
asm
push rbp
mov rbp,rsp
lea rsp,[rsp-$20]
call test2
nop
lea rsp,[rbp+$00]
pop rbp
ret
end;
begin
test1;
ReadLn;
end.
Паскаль вариант
program stackframe_test_pas;
procedure test2;
var
f: array [0..20] of pointer;
begin
WriteLn(CaptureBacktrace(0, 20, @f[0])); // > 8
end;
procedure test1;
begin
test2;
end;
begin
test1;
ReadLn;
end.
Интересно, сделал так - искусственно вызываю исключение и вызываю под x64dbg оба варианта, затем на исключении снимаю стек https://editor.mergely.com/AkOlpwBd блин, разница всего лишь в одном адресе возврата... в этом дело что ли?🤔 как оно влияет-то... это же адрес в секции кода, а не в стеке... не пойму..... program stackframe_test_asm; {$asmmode intel} procedure test2; var x:integer; begin x:=x-x; x:=x div x; end; procedure test1; assembler; nostackframe; asm push rbp mov rbp,rsp lea rsp,[rsp-$20] call test2 nop lea rsp,[rbp+$00] pop rbp ret end; begin test1; ReadLn; end. program stackframe_test_pas; procedure test2; var x:integer; begin x:=x-x; x:=x div x; end; procedure test1; begin test2; end; begin test1; ReadLn; end.
Тэкс... подсказывают мне, что в винде под х64 так просто стек не размотать, нужна ещё какая-то информация сгенеренная компилятором для каждой функции... И похоже FPC тут её просто не сгенерил... Надо бы составить issue на это, но пока что я не могу его грамотно сформировать...
Гуглить про structured exception handling На MSDN была статья про win32 и win64, и принципиально разницу в подходах. На win32 делался параллельный стэк, а на win64 нужны таблицы какие-то
С другой стороны, я не уверен, что issue вообще получится. Если FPC решили в принципе игнорить эту часть винды и делать совсем-совсем свои исключения и ращмотку стекла, они же в принципе имеют такое право и не обязаны это вот все генерить просто чтобы было... Даже если это возможно.
Ну, у меня речь не про исключения - мне нужно просто получить коллстек и всё Кстати FpDebug мне его показывает и ProcessHacker тоже Только виндовая ф-я и PMM Розыча не хотят Буду смотреть как там сделано
Да, включены, но один из них я формирую руками (скопипастил просто асм код скомпиленной паскаль функции)
Гмм... Так информация одна и та же. Нужна размотка стека, просто с разной целью - в логи текстом записать, или по той же самой размотке сделать форсированный выход из пары десятков функций с финализацией локальных переменных.
если дварф включен и прилинкован к бинарю PMM должно показать
Ну у меня виндовая апишка используется без анализа информации из дварфа
Дай кстати пример исполняемого где штатный StackWalc64 не справляется, посмотрю что можно сделать, там в дварфе реально есть подсказки анализ которых просто прикрутить надо
^^^ Тот, который *_asm.exe
Обсуждают сегодня