void print_call_stack()
{
void **ebp = 0;
ASM("mov %%ebp, %0":"=a"(ebp));
while(ebp)
{
kprintf("0x%x\n", ebp[1]); // The caller function address
ebp = (void**)ebp[0]; // Get previous frame
}
}
Wenn du deinen Kernel mit Multiboot lädst, sind sie noch verfügbar. Der Eintrag shdr_addr im Multiboot-Header zeigt auf ein Array von Section-Headern, in dem du nach der Symbol Table durchsuchen kannst.
OK stimmt aber ich persönlich baue meinen Kernel dann lieber mit -g und nutze im Fall der Fälle objdump Das reicht zum debuggen aus.Das nutzt dir aber oft nichts, wenn du nicht weißt aus welcher anderen Funktion (usw. usw.) diese Funktion aufgerufen wurde und am besten ist es, wenn man noch wüsste mit welchen Parametern die jeweiligen Funktionen aufgerufen wurden, aber das umzusetzen ist dann wirklich nicht einfach.
am besten ist es, wenn man noch wüsste mit welchen Parametern die jeweiligen Funktionen aufgerufen wurden, aber das umzusetzen ist dann wirklich nicht einfach.Das stimmt nun auch wieder nict. es reicht ja, wenn man die letzten 30 aufrufe weiß. dann baut man sich so eine art printf, die aber ihr eigenes Array hat wo sie reinschreibt. und bei einer Exception kann man dann auf die gespeicherten Aufrufe zugreifen.
Das stimmt nun auch wieder nict. es reicht ja, wenn man die letzten 30 aufrufe weiß. dann baut man sich so eine art printf, die aber ihr eigenes Array hat wo sie reinschreibt. und bei einer Exception kann man dann auf die gespeicherten Aufrufe zugreifen.Ich habe keine Ahnung was du damit meinst ;) Aber falls es um die Parameter geht, man müsste halt wissen, wieviele Parameter jede Funktion hat und wie groß ein Parameter ist und dafür gibt es ja Debugging-Formate und die zu parsen ist halt nicht einfach.
============================================================================
Unhandled Interrupt occured
EDI = 0x57A18, ESI = 0x57A20, EBP = 0x82CB, EBX = 0x57A24
EDX = 0xC0081038, ECX = 0x1035F4, EAX = 0x0, ESP = 0xDFFFFFD0
INT = 5, ERR = 0x0
EIP = 0x57A20, CS = 0x8, EFLAGS = 0x10206, USRESP = 0x57A20, SS = 0x67E5C
============================================================================
EDI = 0x57A18, ESI = 0x57A20, EBP = 0x82CB, EBX = 0x57A24
EDX = 0xC0081038, ECX = 0x1035F4, EAX = 0x0, ESP = 0xDFFFFFD0
INT = 13, ERR = 0x0
EIP = 0x57A20, CS = 0x8, EFLAGS = 0x10206, USRESP = 0x57A20, SS = 0x67E5C
kernel/isr.c(62): General Protection fault!
Disassembly of section .text:
00100000 <__code>:
Edit 2: Ok, ich hab jetzt verstanden, das es mit ESI - EDI zusammen hängt, also dort ist der Source/Destination Index (richtig?). Allerdings weiß ich noch nicht, wie man anhand dieser Informationen an den Array kommt.
Edit 3: Was mir grad noch auffällt, warum ist der ESI addressen-technisch weiter hinter angesiedelt als der EDI? Das ist doch schon etwas seltsam.
001035c1 <task_switch>:
1035c1: 55 push %ebp
1035c2: 89 e5 mov %esp,%ebp
1035c4: 53 push %ebx
1035c5: 83 ec 14 sub $0x14,%esp
1035c8: a1 2c 8d 10 00 mov 0x108d2c,%eax
1035cd: 85 c0 test %eax,%eax
1035cf: 0f 84 b6 00 00 00 je 10368b <task_switch+0xca>
1035d5: 89 e3 mov %esp,%ebx
1035d7: 89 5d f4 mov %ebx,-0xc(%ebp)
1035da: 89 eb mov %ebp,%ebx
1035dc: 89 5d f0 mov %ebx,-0x10(%ebp)
1035df: e8 84 cc ff ff call 100268 <read_eip>
1035e4: 89 45 ec mov %eax,-0x14(%ebp)
1035e7: 81 7d ec 45 23 01 00 cmpl $0x12345,-0x14(%ebp)
1035ee: 0f 84 9a 00 00 00 je 10368e <task_switch+0xcd>
1035f4: a1 2c 8d 10 00 mov 0x108d2c,%eax
1035f9: 8b 55 f4 mov -0xc(%ebp),%edx
1035fc: 89 50 04 mov %edx,0x4(%eax)
1035ff: a1 2c 8d 10 00 mov 0x108d2c,%eax
103604: 8b 55 f0 mov -0x10(%ebp),%edx
103607: 89 50 08 mov %edx,0x8(%eax)
10360a: a1 2c 8d 10 00 mov 0x108d2c,%eax
10360f: 8b 55 ec mov -0x14(%ebp),%edx
103612: 89 50 0c mov %edx,0xc(%eax)
103615: a1 2c 8d 10 00 mov 0x108d2c,%eax
10361a: 8b 40 14 mov 0x14(%eax),%eax
10361d: a3 2c 8d 10 00 mov %eax,0x108d2c
103622: a1 2c 8d 10 00 mov 0x108d2c,%eax
103627: 85 c0 test %eax,%eax
103629: 75 0a jne 103635 <task_switch+0x74>
10362b: a1 28 8d 10 00 mov 0x108d28,%eax
103630: a3 2c 8d 10 00 mov %eax,0x108d2c
103635: a1 2c 8d 10 00 mov 0x108d2c,%eax
10363a: 8b 40 04 mov 0x4(%eax),%eax
10363d: 89 45 f4 mov %eax,-0xc(%ebp)
103640: a1 2c 8d 10 00 mov 0x108d2c,%eax
103645: 8b 40 08 mov 0x8(%eax),%eax
103648: 89 45 f0 mov %eax,-0x10(%ebp)
10364b: a1 2c 8d 10 00 mov 0x108d2c,%eax
103650: 8b 40 0c mov 0xc(%eax),%eax
103653: 89 45 ec mov %eax,-0x14(%ebp)
103656: a1 2c 8d 10 00 mov 0x108d2c,%eax
10365b: 8b 40 10 mov 0x10(%eax),%eax
10365e: a3 10 70 10 00 mov %eax,0x107010
103663: a1 10 70 10 00 mov 0x107010,%eax
103668: 8b 98 00 20 00 00 mov 0x2000(%eax),%ebx
10366e: 8b 45 ec mov -0x14(%ebp),%eax
103671: 8b 55 f4 mov -0xc(%ebp),%edx
103674: 8b 4d f0 mov -0x10(%ebp),%ecx
103677: fa cli
103678: 89 c1 mov %eax,%ecx
10367a: 89 d4 mov %edx,%esp
10367c: 89 cd mov %ecx,%ebp
10367e: 0f 22 db mov %ebx,%cr3
103681: b8 45 23 01 00 mov $0x12345,%eax
103686: fb sti
103687: ff e1 jmp *%ecx
103689: eb 04 jmp 10368f <task_switch+0xce>
10368b: 90 nop
10368c: eb 01 jmp 10368f <task_switch+0xce>
10368e: 90 nop
10368f: 83 c4 14 add $0x14,%esp
103692: 5b pop %ebx
103693: 5d pop %ebp
103694: c3 ret
Page fault at 0xF45D8A15! (present = 1, rw = 1, user = 0, reserved = 0, id = 0)
EDI = 0x57A17, ESI = 0x57A20, EBP = 0xDFFFFF78, EBX = 0x30DCC
EDX = 0x3, ECX = 0x32, EAX = 0xC008100C, ESP = 0x7DB
EIP = 0x1035D4, CS = 0x8, DS = 0xC0080010, SS = 0x0
INT = 14, ERR = 0x2
EFLAGS = 0x10082, USRESP = 0x0
void task_switch()
{
if(!current_task)
{
return;
}