дамп стека в gcc

Модератор: Модераторы разделов

rendom
Сообщения: 18
ОС: *nix

дамп стека в gcc

Сообщение rendom »

С программным стеком я пока еще не подружился. Поэтому вопросов куча! Самый главный, конечно: как сделать дамп стека из программы?
А теперь много мелких:
- к каким первоисточникам и популярной литературе следует обратиться чтобы разобраться в устройстве программного стека в gcc версии 3.2.3?
- отличается ли и чем организация стека при сборке на 32 и 64 битном линуксе.
- как организован стек при мультипоточном приложении?

Тыкаюсь как-то безсистемно по разным спекам да мануалам, нахожу какие-то куски кода, а собрать все воедино чтобы осознать и понять, не получается. Помогите, а?
Спасибо сказали:
NuINu
Сообщения: 3
ОС: Linux

Re: дамп стека в gcc

Сообщение NuINu »

rendom писал(а):
14.09.2006 21:28
С программным стеком я пока еще не подружился. Поэтому вопросов куча! Самый главный, конечно: как сделать дамп стека из программы?

вот может быть эта программа поможет тебе в этом(написал специально для тебя)

Код: Выделить всё

#include <stdlib.h>

void tst1()
{
  int  st[1] = { 0x7142 };
  void *ptr = &tst1;
 /* printf("Adress tst1: %i", (int)ptr);*/
  printf("Address tst1: %#lx\n", ptr);
  printf("Address st marker: %#lx\n", st[0]);
  int num = 1;
  while(num != 0) {
      printf("Enter number stack entry:");
      scanf("%i", &num);
      printf("Address st[%i] marker: value %#lx, addr %#lx\n", num, st[num], &(st[num]));
  }
}


int main(int argc, char* argv[])
{
   void *ptr_m = &main;
   printf("Usage: %s - send to programm number stack entry and get address from programm\n", argv[0]);
   printf("Address main: %#lx\n", ptr_m);
   tst1();
}

Хочешь почитать??? читай Криса Касперски. и исходные тексты ;-)))
А вообще я не очень люблю эти "хакерские штучки"
вот скажи нафига тебе этот стек???
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: дамп стека в gcc

Сообщение v04bvs »

Ещё здесь можно почитать: http://www.gnu.org/software/libc/manual/ht...Backtraces.html
Спасибо сказали:
Andrew S
Сообщения: 225
Статус: экспериментатор
ОС: Conrad-Gentoo

Re: дамп стека в gcc

Сообщение Andrew S »

v04bvs писал(а):
15.09.2006 17:56
Ещё здесь можно почитать: http://www.gnu.org/software/libc/manual/ht...Backtraces.html

Мне особенно понравилось:
Note that certain compiler optimizations may interfere with obtaining a valid backtrace. Function inlining causes the inlined function to not have a stack frame; tail call optimization replaces one stack frame with another; frame pointer elimination will stop backtrace from interpreting the stack contents correctly.


Мне кажется, что в случае интел-совместимой архитектуры надо делать так:

1. выделить память, в которую будем класть дамп.
2. написать ассемблерную функцию, которая будет копировать кусок памяти от BP до SP в эту память

При необходимости вывода значений регистров:
1. переключаем стек (те же BP и SP) на наш массив
2. в ассемблерной процедуре выталкиваем туда все регистры
3. переключаем стек обратно

Если даже программа собрана с оптимизацией, то это, имхо, должно работать
Спасибо сказали: