2012-04-27 10 views
10

gdb zapewnia funkcjonalność do odczytu lub zapisu do określonego adresu liniowego, na przykład:Jak używać adresu logicznego w gdb?

(gdb) x/1wx 0x080483e4 
0x80483e4 <main>:  0x83e58955 
(gdb) 

ale w jaki sposób można określić adres logiczny? Przyjechałem po drugiej stronie następującej instrukcji:

0x0804841a <+6>:  mov %gs:0x14,%eax 

Jak można odczytać pamięć w „% GS: 0x14” w gdb lub przetłumaczyć ten adres logiczny do liniowego adresu, który mogę wykorzystać w poleceniu x?

uwaga: wiem, że mogę po prostu czytać% eax po tej instrukcji, ale to nie jest moja sprawa

+0

możliwy duplikat [jak rozwiązać segment: offset adresu w GDB] (http://stackoverflow.com/questions/4006686/how-to-resolve-segmentoffset-adres-in-gdb). To jednak nie jest dobra odpowiedź. – Job

Odpowiedz

4

Jak można odczytać pamięć w „% GS: 0x14” w gdb

Nie możesz: GDB nie ma możliwości sprawdzenia, w jaki sposób został ustawiony segment, do którego odnosi się %gs.

lub przetłumaczyć ten adres logiczny na liniowy adres, który mogę wykorzystać w poleceniu x

Ponownie, nie można tego robić w ogóle. Jednak wydaje się, że jesteś na 32-bitowym systemie x86 Linux, a tam możesz może to zrobić - %gs jest skonfigurowany tak, aby wskazywał deskryptor wątku poprzez wywołanie systemowe set_thread_area.

Możesz zrobić catch syscall set_thread_area w GDB i sprawdzić parametry (każdy wątek będzie miał jedno takie wywołanie). Kod w rzeczywistości to here. Gdy już wiesz, jak została skonfigurowana, po prostu dodaj 0x14 do base_addr i gotowe.

+0

Dobra odpowiedź. Niestety, mój program nie wywołuje set_thread_area (2). Możesz zobaczyć kod źródłowy tutaj: http://pastebin.com/us5sbzVg (opcje kompilacji zawarte w kodzie źródłowym). – user368507

+1

@ user368507 Twój program ma tylko jeden wątek. Program * wykonuje * wywołanie 'set_thread_area' (powinieneś być w stanie to zobaczyć pod' strace'). Byłem w stanie złapać to połączenie z GDB; nie wiesz, dlaczego twierdzisz, że 'set_thread_area' nie jest wywoływane. –

+0

mój błąd. Użyłem innego komputera po OP. To był x86-64 ... Jesteś anwser działa doskonale na 32bit x86. Sądzę, że na x86-64 rzeczy wyglądają inaczej. – user368507

Powiązane problemy