169 похожих чатов

В общем Розыч @rouse_79 , вот тебе загадка ) Я чёт

не врубаюсь...

Почему в асм варианте - колстек ломается, а в чисто-паскалевском - не ломается?
Смотрю твоим 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.

13 ответов

4 просмотра
notme- Автор вопроса

Интересно, сделал так - искусственно вызываю исключение и вызываю под 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.

notme- Автор вопроса
notme
Интересно, сделал так - искусственно вызываю исклю...

Тэкс... подсказывают мне, что в винде под х64 так просто стек не размотать, нужна ещё какая-то информация сгенеренная компилятором для каждой функции... И похоже FPC тут её просто не сгенерил... Надо бы составить issue на это, но пока что я не могу его грамотно сформировать...

notme
Тэкс... подсказывают мне, что в винде под х64 так ...

Гуглить про structured exception handling На MSDN была статья про win32 и win64, и принципиально разницу в подходах. На win32 делался параллельный стэк, а на win64 нужны таблицы какие-то

notme
Тэкс... подсказывают мне, что в винде под х64 так ...

С другой стороны, я не уверен, что issue вообще получится. Если FPC решили в принципе игнорить эту часть винды и делать совсем-совсем свои исключения и ращмотку стекла, они же в принципе имеют такое право и не обязаны это вот все генерить просто чтобы было... Даже если это возможно.

notme- Автор вопроса
Arioch The
С другой стороны, я не уверен, что issue вообще по...

Ну, у меня речь не про исключения - мне нужно просто получить коллстек и всё Кстати FpDebug мне его показывает и ProcessHacker тоже Только виндовая ф-я и PMM Розыча не хотят Буду смотреть как там сделано

notme- Автор вопроса

Да, включены, но один из них я формирую руками (скопипастил просто асм код скомпиленной паскаль функции)

notme
Ну, у меня речь не про исключения - мне нужно прос...

Гмм... Так информация одна и та же. Нужна размотка стека, просто с разной целью - в логи текстом записать, или по той же самой размотке сделать форсированный выход из пары десятков функций с финализацией локальных переменных.

notme
Ну, у меня речь не про исключения - мне нужно прос...

если дварф включен и прилинкован к бинарю PMM должно показать

notme- Автор вопроса
notme
Ну, у меня речь не про исключения - мне нужно прос...

Ну у меня виндовая апишка используется без анализа информации из дварфа

notme
Ну, у меня речь не про исключения - мне нужно прос...

Дай кстати пример исполняемого где штатный StackWalc64 не справляется, посмотрю что можно сделать, там в дварфе реально есть подсказки анализ которых просто прикрутить надо

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта