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 ответов

8 просмотров
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 не справляется, посмотрю что можно сделать, там в дварфе реально есть подсказки анализ которых просто прикрутить надо

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта