gdb kann nicht auf Speicher-Adresse Fehler
hier ist mein disas-code:
0x0804844d <+0>: push %ebp
0x0804844e <+1>: mov %esp,%ebp
0x08048450 <+3>: and $0xfffffff0,%esp
0x08048453 <+6>: sub $0x20,%esp
0x08048456 <+9>: movl $0x8048540,(%esp)
0x0804845d <+16>: call 0x8048310 <puts@plt>
0x08048462 <+21>: lea 0x1c(%esp),%eax
0x08048466 <+25>: mov %eax,0x4(%esp)
0x0804846a <+29>: movl $0x8048555,(%esp)
0x08048471 <+36>: call 0x8048320 <scanf@plt>
0x08048476 <+41>: mov 0x1c(%esp),%eax
0x0804847a <+45>: cmp $0x208c,%eax
0x0804847f <+50>: jne 0x804848f <main+66>
0x08048481 <+52>: movl $0x8048558,(%esp)
0x08048488 <+59>: call 0x8048310 <puts@plt>
0x0804848d <+64>: jmp 0x804849b <main+78>
=> 0x0804848f <+66>: movl $0x8048569,(%esp)
0x08048496 <+73>: call 0x8048310 <puts@plt>
0x0804849b <+78>: mov $0x0,%eax
0x080484a0 <+83>: leave
0x080484a1 <+84>: ret
was ich bin tring zu prüfen, ist $0x208c. Wenn ich Typ x/xw 0x208c es gibt mir wieder Fehler, die sagt Cannot access memory at address 0x208c. Wenn ich Info registriert und Blick auf eax sagt es, dass der Wert, den ich zur Verfügung gestellt. Also im Grunde dieses Programm vergleicht zwei Werte und je nachdem, druckt etwas aus.Das problem ist, dass diese Hausaufgaben von der Universität, und ich hab keinen code. Hoffe, Sie können helfen. Danke.
- [finger in der Luft], den Sie übergeben, ein illegaler parameter? Du sitzt da, vor dem debugger. Was könnten wir aus der Arbeit, dass Sie das nicht können, vor allem ohne source code? Es ist eine sehr seltsame Zuordnung, die Sie fragt, fix Sachen ohne Quelle...
- ich endlich herausgefunden, um mit dem print-Anweisung anstelle von x/xw-können Sie bitte erklären, warum print gearbeitet und x nicht?
- $0x208c ist ein absoluter Wert, kein memory-Adresse!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Demontage für das Programm sagt, dass es nicht so etwas wie dieses:
In anderen Worten, die
0x208c
ist ein Wert (8332
), dass das Programm hart codiert in es, und ist nicht einen Zeiger. Daher GDB ist völlig richtig sagen Sie, dass, wenn Sie interpretieren0x208c
als Zeiger, die Zeiger nicht lesbaren Speicher.Sie scheinen nicht zu verstehen, den Unterschied zwischen
print
undexamine
Befehle. Betrachten Sie dieses Beispiel:Mit oben
print pfoo
geben Sie die Adresse vonfoo
, undx pfoo
geben Sie die Wert gespeichert, die Adresse (d.h. den Wert, derfoo
).Fand ich heraus, dass es unmöglich ist, zu prüfen
mmap
ed-Speicher, der nichtPROT_READ
Flagge. Dies ist nicht das OPs-problem, aber es war meins, und die Fehlermeldung ist die gleiche.Statt
tun
und voila, der Speicher geprüft werden können.
Nicht initialisierte Zeiger
Ist es ziemlich offensichtlich im Nachhinein, aber das ist, was verursacht wurde GDB zu zeigen, dass die Fehlermeldung mir. Zusammen:
Dann:
Aber in ein Komplexes Programm, natürlich, und wo die Adresse war etwas zufällig von null Verschieden.
In meinem Fall das problem verursacht wurde durch den Aufruf munmap mit Länge größer als mmap:
Also das Abkoppeln auch nicht zugeordnete Zuweisungen für Stapel von ein paar threads. Ziemlich böse, weil es machte die core-dump unmöglich, mit meinem aktuellen skill-level. Vor allem, dass im ursprünglichen problem die Größe übergeben munmap war etwas zufällig. Und es stürzte nur manchmal und das Ende eines sehr langen Prozesses.
Wenn der GDB sagt Speicheradresse nicht gefunden, dass heißt, das symbol ist nicht verfügbar in der ausführbaren Datei geöffnet, durch gdb oder über Datei-exefilename. ODER Sie haben nicht kompiliert die exefile mit option-g an. Was passiert, wenn Sie ein Neuling für gdb können Sie haben den Befehl Datei argfile statt laufen argfile. Pls überprüfen.