Add backtrace function
This commit is contained in:
parent
50fa9b7d24
commit
085857a900
6
Makefile
6
Makefile
@ -2,9 +2,11 @@
|
|||||||
CPPFLAGS = -MMD
|
CPPFLAGS = -MMD
|
||||||
AS=nasm
|
AS=nasm
|
||||||
ASFLAGS += -f elf32
|
ASFLAGS += -f elf32
|
||||||
|
#LDFLAGS += -m32 -nostdlib -mkernel -fno-stack-protector
|
||||||
LDFLAGS += -m32 -nostdlib -static -fno-common -fno-use-cxa-atexit -fno-exceptions -fno-non-call-exceptions -fno-weak -fno-rtti -fno-stack-protector
|
LDFLAGS += -m32 -nostdlib -static -fno-common -fno-use-cxa-atexit -fno-exceptions -fno-non-call-exceptions -fno-weak -fno-rtti -fno-stack-protector
|
||||||
CFLAGS += -m32 -Wall -Wextra -Werror -ffreestanding -fno-exceptions -fno-pie -fno-stack-protector
|
CFLAGS += -m32 -Wall -Wextra -Werror -ffreestanding -fno-exceptions -fno-pie -fno-stack-protector
|
||||||
CXXFLAGS += -m32 -Wall -Wextra -Werror -ffreestanding -fno-exceptions -fno-rtti -fno-pie
|
CXXFLAGS += -m32 -Wall -Wextra -Werror -ffreestanding -fno-exceptions -fno-rtti -fno-pie
|
||||||
|
DEBUG_FLAGS += -g -Og -DDEBUG -fno-omit-frame-pointer
|
||||||
|
|
||||||
SUBDIRS := core drivers tests
|
SUBDIRS := core drivers tests
|
||||||
|
|
||||||
@ -44,8 +46,8 @@ self_test: clean kernel
|
|||||||
test:kernel
|
test:kernel
|
||||||
qemu-system-x86_64 -kernel $<
|
qemu-system-x86_64 -kernel $<
|
||||||
|
|
||||||
debug: CFLAGS += -g -Og
|
debug: CFLAGS += $(DEBUG_FLAGS)
|
||||||
debug: CXXFLAGS += -g -Og
|
debug: CXXFLAGS += $(DEBUG_FLAGS)
|
||||||
debug:kernel kernel.sym
|
debug:kernel kernel.sym
|
||||||
qemu-system-x86_64 -s -S -kernel kernel&
|
qemu-system-x86_64 -s -S -kernel kernel&
|
||||||
gdb -s kernel.sym -ex "target remote localhost:1234"
|
gdb -s kernel.sym -ex "target remote localhost:1234"
|
||||||
|
28
core/stack.c
Normal file
28
core/stack.c
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#include "stack.h"
|
||||||
|
#include "vga.h"
|
||||||
|
|
||||||
|
void printStackTrace(unsigned int maxFrames){
|
||||||
|
#ifdef DEBUG
|
||||||
|
// Now on Stack:
|
||||||
|
// ( potential second function argument )
|
||||||
|
// first function argument (maxFrames)
|
||||||
|
// return address from caller
|
||||||
|
// EBP (Extended Base Pointer) of calling function
|
||||||
|
unsigned int * ebp = &maxFrames - 2;
|
||||||
|
for (unsigned int frame = 0 ; frame < maxFrames; frame ++){
|
||||||
|
unsigned int eip = ebp [1];
|
||||||
|
if (eip == 0){
|
||||||
|
// No caller on stack
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ebp = (unsigned int *)(ebp[0]);
|
||||||
|
//unsigned int * arguments = &ebp[2];
|
||||||
|
printf(" 0x%x\n", eip);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
printf("Must be compiled with -fno-omit-frame-pointer for full stack\n");
|
||||||
|
unsigned int * ebp = &maxFrames - 2;
|
||||||
|
unsigned int eip = ebp [1];
|
||||||
|
printf("Caller: 0x%x\n", eip);
|
||||||
|
#endif
|
||||||
|
}
|
3
core/stack.h
Normal file
3
core/stack.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
void printStackTrace(unsigned int maxFrame);
|
Loading…
Reference in New Issue
Block a user