2016-07-15 8 views
1

Hier ist meine g ++:Warum kann gdb Debug-Informationen nicht anzeigen?

$ /usr/local/gcc-4.8.1-for-linux32/bin/i586-pc-linux-g++ -v 
Using built-in specs. 
COLLECT_GCC=/usr/local/gcc-4.8.1-for-linux32/bin/i586-pc-linux-g++ 
COLLECT_LTO_WRAPPER=/usr/local/gcc-4.8.1-for-linux32/libexec/gcc/i586-pc-linux/4.8.1/lto-wrapper 
Target: i586-pc-linux 
Configured with: ../gcc-4.8.1/configure --target=i586-pc-linux --build=i686-apple-darwin11 --prefix=/usr/local/gcc-4.8.1-for-linux32 --disable-multilib --enable-languages=c,c++ --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --disable-bootstrap 
Thread model: posix 
gcc version 4.8.1 (GCC) 

GDB:

$ i386-linux-gdb -v 
GNU gdb (GDB) 7.7.1 
This GDB was configured as "--host=x86_64-apple-darwin15.5.0 --target=i386-linux". 

CXX_FLAGS:

-ffreestanding -O0 -Wall -Wextra -fno-exceptions -fno-rtti -ggdb -nostdlib -std=c++11 -m32 

erzeugen kernel.bin:

/usr/local/gcc-4.8.1-for-linux32/bin/i586-pc-linux-g++ -I. -Iinclude -Ikernel -ffreestanding -O0 -Wall -Wextra -fno-exceptions -fno-rtti -ggdb -nostdlib -std=c++11 -m32 -e main -Ttext 0x100000 -o generated/kernel.bin generated/kernel/init/kernelMain.o generated/kernel/memoryManage/memoryManage.o 
/usr/local/gcc-4.8.1-for-linux32/bin/i586-pc-linux-objdump -S -D generated/kernel.bin > generated/kernel.dump 

Ich benutze Qemu-i 386 um mein Spielzeug-Betriebssystem zu laden, dann parst mein Bootloader kernel.bin, legt Segmente in den Speicher. Dann beginne ich GDB in meinem Host-Betriebssystem (OS X 10.11), ausführen:

file ./generated/kernel.bin 
target remote localhost:1234 
b initMemory 
c 

ich erfolgreich bei Stopp-Funktion kann initMemory, die in memoryManage.o ist.

8: x/i 0x100000 + $eip 
    0x100010 <initMemory()>: push %ebp 

Jedoch, wenn ich ausführen n oder s oder p es funktioniert nicht. Ich kann nur verwenden sini

(gdb) n 
Cannot find bounds of current function 
(gdb) s 
Cannot find bounds of current function 
(gdb) p memoryInfoAddr 
No symbol "memoryInfoAddr" in current context. 

Wie kann ich dieses Problem beheben? Wird es durch die Nichtübereinstimmung von i586 g ++ und i386 gdb oder durch die fehlende Übereinstimmung von gcc 4.8.1 und gdb 7.7.1 verursacht?

+0

Überprüfen Sie Ihre Befehlszeile, um zu überprüfen, ob Sie dem * Compiler * mitteilen, Debuginformationen zu generieren. Bei einigen Compilern ist die Option "-g". –

+0

@ThomasMatthews Ich habe die -ggdb, und die Dump-Datei von kernel.bin hat viele Debug-Abschnitte, wie zum Beispiel debug_info, debug_line ... –

Antwort

1

Endlich finde ich das Problem. gdb benutzt %eip, um Anweisungen zu finden, aber in meinem Kernel sollte %cs:%eip verwendet werden. Nach der Einstellung %cs bis 0 funktioniert gdb wie erwartet.

+0

Set '% cs', um gdt Selektor zu korrigieren –