powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
7 сообщений из 7, страница 1 из 1
Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
    #39751713
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При запросе большего количества чем есть в стеке происходит AV в libgcc_s.so.1 при обращении к адресу 0000000000000001.

Вряд ли таким образом реализована обработка ошибок в функции backtrace для случаев когда запрошено больше чем имеется.
Следовательно, либо начало стека инициализировано не верно, либо цепочка вызовов побита (но как?).

Вроде, правильно портировал декларацию функции:
Код: plaintext
1.
extern int backtrace (void **__array, int __size) __nonnull ((1));


Код: pascal
1.
function backtrace(buffer: PPointer; size: Integer): Integer; cdecl; external libc;



Пример кода:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
program test2;

uses
  System .SysUtils,
  Posix.Base,
  Posix.SysMman;

function backtrace(buffer: PPointer; size: Integer): Integer; cdecl; external libc;

procedure GetStackTrace(Depth: Integer);
var
  LCount: Integer;
  LStack: Pointer;
begin
  GetMem(LStack, SizeOf(Pointer) * Depth);
  LCount := backtrace(@LStack, Depth);
end;

procedure WindStackTrace(Depth: Integer);

  procedure DoWindStack(I: Integer);
  begin
    Inc(I);
    if I < Depth then
      DoWindStack(I)
    else
      GetStackTrace(Depth);
  end;

var
  I: Integer;
begin
  I := 0;
  DoWindStack(I);
end;

begin
  try
    //System.ReleaseZeroPage - did not help...
    munmap(nil, High(Word) - 4096);

    //this work
    GetStackTrace(1);

    //this works because the stack is wound
    WindStackTrace(10);

    //this does not work:
    //  there is not so many entries in the stack?
    //  or stack base is not initialized propery?
    //  or stack pointers chain is broken?
    GetStackTrace(10);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.



Текст ошибки:
Код: plaintext
EAccessViolation: Access violation at address 00007F36CFECFCCB, accessing address 0000000000000001

Call Stack:
Код: pascal
1.
2.
3.
4.
5.
:00007FFFF79B2CCB ??
:00007FFFF79B4668 _Unwind_Backtrace
:00007FFFF76EFB4F backtrace
Test2.GetStackTrace(0)
Test2.initialization



Кто-то сталкивался с подобным?

На всякий случай создал тикет .
...
Рейтинг: 0 / 0
Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
    #39751723
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalovВроде, правильно портировал декларацию функции:
И портировал не совсем правильно и вызываешь криво. Я бы сделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function backtrace(var buffer: Pointer; size: Integer): Integer; cdecl; external libc;

procedure GetStackTrace(Depth: Integer);
var
   LCount: Integer;
   LStack: PPointer;
begin
   GetMem(LStack, SizeOf(Pointer) * Depth);
   LCount := backtrace(LStack, Depth);
end;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
    #39751735
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Проверил - не помогло.

Где именно не правильно портировал?
В итоге, у вас также передается указатель на указатель. Да, более delphi style, но сейчас не до жиру.
...
Рейтинг: 0 / 0
Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
    #39751746
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalovГде именно не правильно портировал?

Атрибут, который запрещает первому параметру быть nil не учёл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
    #39751848
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalovсейчас не до жиру.

Тогда просто в своём коде убери @ при вызове backtrace.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
    #39751879
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Не то.

Видимо, у Delphi получается не совсем совместимый с backtrace стек. В этой библиотеке они столкнулись с тем же, в итоге разматывают сами.
И здесь про это же.

Буду сам разматывать...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
    #40072113
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пофиксили в 10.4.2 - проверил, работает.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Linux backtrace -> SIGSEGV - некорректная инициализация стека при запуске программы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]