С программным стеком я пока еще не подружился. Поэтому вопросов куча! Самый главный, конечно: как сделать дамп стека из программы?
А теперь много мелких:
- к каким первоисточникам и популярной литературе следует обратиться чтобы разобраться в устройстве программного стека в gcc версии 3.2.3?
- отличается ли и чем организация стека при сборке на 32 и 64 битном линуксе.
- как организован стек при мультипоточном приложении?
Тыкаюсь как-то безсистемно по разным спекам да мануалам, нахожу какие-то куски кода, а собрать все воедино чтобы осознать и понять, не получается. Помогите, а?
дамп стека в gcc
Модератор: Модераторы разделов
-
NuINu
- Сообщения: 3
- ОС: Linux
Re: дамп стека в gcc
вот может быть эта программа поможет тебе в этом(написал специально для тебя)
Код: Выделить всё
#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
Ещё здесь можно почитать: http://www.gnu.org/software/libc/manual/ht...Backtraces.html
-
Andrew S
- Сообщения: 225
- Статус: экспериментатор
- ОС: Conrad-Gentoo
Re: дамп стека в gcc
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. переключаем стек обратно
Если даже программа собрана с оптимизацией, то это, имхо, должно работать