GDB qo'shimcha yordam uchun Nalagodzhenya. Vyvchaemo vykoristanny GDB bilan bola jarayonini kamaytirish

G.D.B."oqilona" dasturlarga o'ting, masalan, kodni "tushunadigan" va uni ketma-ket ochadiganlar, o'zgarishlar qiymatlarini o'zgartiradiganlar, nazorat nuqtalari va aqliy hujumlarni o'rnatadiganlar ... Bir so'z bilan aytganda, hamma narsani qilish uchun qiling. dasturchiga o'ting va dasturlaringiz to'g'ri ishlayotganligini tekshiring.

G.D.B. boy xotiralar UNIX-Bunday tizimlar ko'plab dasturlarni nozik sozlashni ham amalga oshiradi. Ular orasida Si ham bor.

Biz bilan bog'lanish G.D.B. terminalda buyruqni kiriting

Gdb

Tizimga kirish uchun G.D.B.: buyruqni kiriting

Chiqish yoki C –d

Boshqa muhim GDB buyruqlari

ishga tushirish [dastur buyruq qatori argumentlari] Dasturni ishga tushiring. break [satr raqami / funksiya nomi] Dasturning uzilish nuqtasini keyingi qator yoki funksiyaga qo'ying. keyingi Funktsiyaning o'rtasiga kirmasdan, tajovuzkor qatorga o'ting. qadam Bosish qatoriga o'ting. Agar qatorda funksiya mavjud bo'lsa, unga o'ting. ro'yxat Dastur kodining bir qismini kiriting (nuqta qo'yilgan joy atrofidagi qatorlar soni) chop etish [o'zgartirish] Ekranga o'zgartirish qiymatini kiriting. info locals Barcha mahalliy o'zgarishlarning aniq qiymatlarini tsikl, funktsiya va boshqalar o'rtasida kiriting. displey [o'zgartirish] Teri terisidagi o'zgarish qiymatini kiriting. yordam Barcha mavjud GDB buyruqlar roʻyxatini koʻrsatish.

Keling, caesar.c ilovasida GDB bilan qanday ishlashni hayratda qoldiraylik, chunki siz hamma narsa uchun hamma narsani qilgansiz, o'tgan yili allaqachon yozgansiz. Biz uni eski versiyada tekshiramiz, shuning uchun natijalaringiz amalga oshirilishiga qarab farq qilishi mumkin.

Keling, "CS50 Virtual Laboratory" yoki CS50 IDE-dagi pset2 jildiga (biz uni qanday olishni allaqachon eslaysiz deb o'ylaymiz) boramiz. Buyruqni kiriting:

Gdb. / Qaysar

Sezar dasturi bitta funktsiyaga ega, asosiy. Keling, dasturning boshlang'ich nuqtasini asosiy funktsiyaga o'rnatamiz:

asosiyni sindirish

Keling, "3" argumenti bilan Tsezar dasturini ishga tushiramiz:

13-yugurish

Aytaylik, argc qiymatlarini tekshirishimiz kerak:

argc-ni chop eting

O'qni terminal oynasida ko'rish mumkin:

Endi keyingi buyruq yordamida dasturni bosqichma-bosqich yakunlaymiz. Biz bir necha marta ko'rishimiz mumkin.

Bu erda o'zgaruvchan kalit ma'no beradi. Keling, ushbu qatorda qanday ahamiyatga ega ekanligini tekshiramiz:

Keyingi birinchi bosishda o'zgaruvchan kalit "0" ga o'rnatiladi. Nega biz 3 raqamini o'tkazib yubordik? O'ng tomonda jamoa hali Vikonanga kirmagan. Agar siz yana bir marta kiritsangiz, dastur matn kiritishingizni taklif qiladi.

"Keyingi" buyrug'ini yana bir bor kiritib, biz aqliy tsiklning o'rtasiga o'tamiz.

Dasturlarni meta takomillashtirish - koddan tuzatishlarni olib tashlash. Nima uchun hamma narsadan xabardor bo'lgan siz mashhurlarning lagerini kuzatish imkoniga egasiz? Wyconnanny soati, Bu bilish jarayonining o'zi bilan bir xil (masalan, aqliy o'tishlarni amalga oshirish). Bu erda etakchi bizning birinchi yordamchimiz. Albatta, Cda dasturlarni hech qanday qiyinchiliksiz ishga tushirish uchun juda ko'p imkoniyatlar mavjud: oddiy printf(3) dan syslog tarmog'i bo'ylab maxsus logging tizimlarigacha. Assemblerda bunday usullar hali ham turg'un, aks holda interaktiv muharrirda ishlab chiqish ancha oson bo'lgan registrlar, operativ xotira qoldiqlari va boshqa nutqlar haqida ehtiyot bo'lishingiz kerak bo'lishi mumkin. Aytgancha, agar siz assembler tilida yozsangiz, muharrirsiz ishlamasligingiz dargumon.

Siz to'xtash nuqtasini belgilashdan boshlashingiz mumkin, chunki siz kodning qaysi qismiga amal qilishingiz kerakligini allaqachon bilasiz. Bu eng tez-tez ishlatiladigan usul: nuqta qo'ying, dasturni ishga tushiring va bosqichma-bosqich o'ting, shu bilan birga kerakli o'zgarishlar va registrlarni kuzatib boring. Bundan tashqari, dasturni eng yaxshi sharoitlarda va segmentatsiya xatosi tufayli ishlamay qolganda oddiygina ishga tushirishingiz mumkin - shuning uchun siz qaysi ko'rsatma xotiraga kirishni taqiqlash uchun mo'ljallanganligini bilib olishingiz mumkin, keyin o'zgarishlarga qarang va hokazo. . Endi siz yana ushbu kodga amal qilishingiz mumkin, uni bosqichma-bosqich ko'rib chiqing, muvaffaqiyatsizlikdan biroz oldinroq nuqta qo'ying.

Keling, buni oddiy qilaylik. Keling, Salom dunyo dasturini olaylik va kompilyator kaliti -g yordamida kerakli ma'lumotlar bilan kompilyatsiya qilamiz:

$ gcc -g salom.s -o salom $

gdb-ni ishga tushiring:

$ gdb ./salom GNU gdb 6.4.90-debian Mualliflik huquqi (C) 2006 Free Software Foundation, Inc. GDB bepul dasturiy ta'minot bo'lib, u GNU General Public License litsenziyasiga ega va siz uni o'zgartirish va/yoki uning nusxalarini boshqa odamlarga tarqatish niyatidasiz. Shartlarni ko'rish uchun "nusxalashni ko'rsatish" ni kiriting. Bu GDB uchun mutlaqo kafolat emas. Tafsilotlar uchun "kafolatni ko'rsatish" ni kiriting. Bu GDB "i486-linux-gnu" sifatida sozlangan... "/lib/tls/libthread_db.so.1" xost libthread_db kutubxonasidan foydalanish. (gdb)

GDB ishga tushdi, quyidagi dasturni ishga tushirdi, so'rovlar ekraniga (gdb) qaradi va buyruqlarni tekshirdi. Biz dasturni "bosqichma-bosqich" (bir bosqichli rejim) orqali o'tmoqchimiz. Buning uchun dasturning ishlashi mumkin bo'lgan buyruqni ko'rsatish kerak. Siz kichik dasturni belgilashingiz mumkin - bu ushbu kichik dastur uchun yakuniy ko'rsatmalarni boshlashdan oldin amalga oshiriladi. Bundan tashqari, fayl nomi va qator raqamini belgilashingiz mumkin.

(gdb) b 0x8048324 da asosiy uzilish nuqtasi 1: hello.s fayli, 17-qator. (gdb)

b - qisqa muddatli tanaffus. Barcha GDB buyruqlari qisqartirilishi mumkin, chunki ular ikki marta qiymatli shifrlarni yaratmaydi. Biz dasturni ishga tushirish buyrug'i bilan ishga tushiramiz. Bu buyruq avval ishlayotgan dasturlarni qayta ishga tushirish uchun ishlatiladi.

(gdb) r Dasturni ishga tushirish: /tmp/hello Breakpoint 1, main () at hello.s:17 17 movl $4, %eax /* tizim raqamini qo'ying yozish = 4 Joriy til: auto; hozirda asm (gdb)

GDB dasturni yuklab oladi va buyruqlarni tekshiradi. Keyingi bosqichga qo'shiladigan dasturingiz buyrug'ini, faylga qo'shiladigan funktsiyalarni va qator raqamini belgilang. Satrma-satr viki uchun biz ikkita buyruqdan foydalanishimiz mumkin: step (qisqartirilgan s) va keyingi (n sifatida qisqartirilgan). Step buyrug'i dasturni pastki dastur bo'limiga kirish orqali tugatadi. Keyingi buyruq ipning pastki dasturining ko'rsatmalarini parcha-parcha bajaradi.

(gdb) n 20 movl $1, %ebx /* birinchi parametr - %ebx */ (gdb) ni ro'yxatdan o'tkazish uchun

Endi, 17-qator uchun ko'rsatmalar yozilgan va biz %eax registrida 4 raqami borligini tushunamiz. Turli viruslarni ekranda ko'rsatish uchun chop etish buyrug'idan foydalaning (qisqartirilgan p ). Assembler buyruqlarini almashtirishda GDB registr yozuvida $replace % belgisiga ega. Keling, %eax registrida nima borligini ko'rib chiqaylik:

(gdb) p $eax $1 = 4 (gdb)

4-harakat! GDB barcha ifoda chiqishlarini raqamlaydi. Endi bizda birinchi virus ($1) bor, u 4 yoshdan katta. Endi bu virusga qadar siz ularga murojaat qilishingiz mumkin. Siz oddiy hisob-kitoblarni ham bajarishingiz mumkin:

(gdb) p $1 $2 = 4 (gdb) p $1 + 10 $3 = 14 (gdb) p 0x10 + 0x1f $4 = 47 (gdb)

Biz chop etish buyrug'i bilan o'ynaganimizda, ko'rsatma qanday tugashini allaqachon unutgan edik. Ma'lumot qatori buyrug'i kod qatoridagi ko'rsatmalar haqidagi ma'lumotlarni ko'rsatadi. Argumentlarsiz, ishlab chiqarish liniyasi haqidagi ma'lumotlarni ko'rsating.

(gdb) "hello.s" ning 20-qatori 0x8048329 manzildan boshlanadi va 0x804832e da ​​tugaydi . (gdb)

Ro'yxat buyrug'i (qisqartirilgan l) ekranda dasturingizning chiqish kodini ko'rsatadi. Argumentlarni qanday topshirish mumkin:

  • qator raqami- oqim faylining qator raqami;
  • fayl: qator_raqami- belgilangan fayl uchun qator raqami;
  • Ularning_funksiyalari- ular hech qanday noaniqliksiz funktsiyalarga ega;
  • fayl: function_name- ko'rsatilgan fayl uchun funksiyalarga ega bo'lish;
  • *manzillar- xotiradagi manzillar, undan keyin kerakli ko'rsatmalar.

Agar siz bitta argumentni topshirsangiz, ro'yxat buyrug'i bir joyda 10 qator chiqish kodini ishlab chiqaradi. Ikkita argumentni o'tkazish orqali siz ro'yxatning boshida va oxirida qatorni belgilaysiz.

(gdb) l main 12 bu fayl chegaralari orqasida */ 13 .type main, @function /* main - funktsiya (ma'lumotlar emas) */ 14 15 16 main: 17 movl $4, %eax /* sonini qo'ying tizim chaqiruvi 18 registrga yozish = 4 %eax */ 19 20 movl $1, %ebx /* birinchi parametrni 21 %ebx registriga joylashtiring; fayl deskriptor raqami 22 stdout = 1 */ (gdb) l *$eip 0x8048329 hello.s:20 da joylashgan. 15 16 asosiy: 17 movl $4, %eax /* tizim chaqiruv raqamini 18 registrga yozing = 4 yozing %eax */ 19 20 movl $1, %ebx /* 21 %ebx registriga birinchi parametrni joylashtiring; fayl deskriptor raqami 22 stdout = 1 */ 23 movl $hello_str, %ecx /* 24 %ecx registriga boshqa parametrni joylashtiring; satr boshiga indikator */ (gdb) l 20, 25 20 movl $1, %ebx /* birinchi parametrni 21 %ebx registriga joylashtiring; fayl deskriptor raqami 22 stdout = 1 */ 23 movl $hello_str, %ecx /* 24 %ecx registriga boshqa parametrni joylashtiring; Har bir satr uchun indikator */25 (gdb)

Ushbu buyruqni yodlang: $eip ro'yxati. Ushbu yordam yordamida siz bir vaqtning o'zida yozilgan ko'rsatmalar yonidagi chiqish kodini ko'rishingiz mumkin. Keling, dasturimizni yakunlaymiz:

(gdb) n 23 movl $hello_str, %ecx /* registrga boshqa parametrni joylashtiring %ecx (gdb) n 26 movl $hello_str_length, %edx /* uchinchi parametrni %edx (gdb) registriga joylashtiring

Bu to'g'ri emas, men n ni bosishdan charchadim? Agar siz shunchaki Enter tugmasini bossangiz, GDB qolgan buyruqni takrorlaydi:

(gdb) 29 int $0x80 /* wiklikati pererivannya 0x80 */ (gdb) Salom, dunyo! 31 movl $1, %eax /* tizim wiki raqamidan chiqish = 1 */ (gdb)

Yana bir qulay buyruq, Yaku Varto zodagonligi haqida - ma'lumot registrlari. Albatta, i r ga qisqartirilishi mumkin. Siz unga parametrni o'tkazishingiz mumkin - sozlanishi kerak bo'lgan registrlar ro'yxati. Masalan, agar login himoyalangan rejimda yaratilgan bo'lsa, biz segment registrlarining qiymatlarini o'tkazib yuborishimiz dargumon.

(gdb) ma'lumot registrlari eax 0xe 14 ecx 0x804955c 134518108 edx 0xe 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xa806x 0xa2305 80 4833a eflags 0x246 [PF ZF IF] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb) ma'lumot registrlari 0xe01408x 0xe1018x 0x e 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xbfabb5a8 esi 0x0 0 edi 0xb7f6bcc0 -1208566592 eip 0x804833a 0x804 bayroqlar 0x246 [PF ZF IF] (gdb)

Shunday qilib, registrlardan tashqari, bizda ham bor

Bugun siz o'ngdan yana bir krok ishlab olasiz
Vivchennya Linux tizimlari. Men sizga asoslar haqida aytib beraman
Ishingizni gdb bilan oling. Ularni o'zlashtirib, siz har qanday dastur qanday ishlashini tushunishingiz va o'zingizning ekspluatatsiyalaringizni yozishingiz mumkin.

Siz, ehtimol, barchangiz ta'mirlashchi, gdb kabi nutq haqida eshitgansiz - bu tuzatuvchi bilan bir xil. GDB-GNU
Nosozliklarni tuzatuvchi. Bu Windows uchun SoftICE-ga o'xshaydi (bilmaganlar uchun bu eng ommabop va, mening fikrimcha, eng foydalisiga aylandi), faqat ostida
Linux tizimlari. O'ng tomonda, bu nutqning ishini ko'rsatish uchun juda ko'p hujjatlar yo'q va men uni o'zim o'zlashtirganman. Otje,
Hujjat asosiy gdb buyruqlarini tavsiflaydi. Hamma narsa misolda ko'rsatiladi. Va bir dumba sifatida, men ha dasturini olishga qaror qildi. Bilmaganlar uchun bu dastur shunchaki "y" belgisini cheksiz bo'lguncha chop etadi, shuning uchun men bu belgini emas, balki "XAKEP" qatorini chop etishni o'rganishga qaror qildim, bu qiziqarliroq bo'lardi.

Xo'sh, endi hammasi joyida. Tahrirlovchining o'zi quyidagicha boshlanadi:

Agar siz turli xil parametrlarni kiritishingiz mumkin bo'lsa, biz dasturga amal qilish usuliga ega bo'lamiz:

# gdb /usr/bin/ha

Siz asosiy fayllarni ko'rishingiz mumkin, ular uchun quyidagilarni kiritishingiz kerak:

# gdb /usr/bin/ha yadrosi

Buning o'rniga registrlarni ko'rish uchun sizga buyruq kerak bo'lishi mumkin:

(gdb) axborot registrlari

yoki shunga o'xshash (qisqa versiya)

Keling, robitining qanday qilib haddan tashqari sakrashini ko'rib chiqaylik. Shoshmoqda
chalkashlik nuqtalari, haddan tashqari to'planish nuqtalari va ehtiyotkorlik nuqtalari. Aniqroq aytganda, men o'rganish nuqtalariga e'tibor qaratmoqchiman. U o'rnatilishi mumkin:

(gdb) tanaffus funktsiyasi - funktsiyaga kirishdan oldin Zupinity
(gdb) break *adres - Manzil bo'yicha ko'rsatmalarga amal qilishdan oldin yuboring.

O'rnatishdan so'ng siz buyruqni ishlatadigan barcha nuqtalarni ko'rishingiz mumkin:

(gdb) axborot uzilishi

Va keyin siz ushbu fikrlarni o'chirishingiz mumkin:

(gdb) aniq to'xtash nuqtasi - de break to'xtash nuqtasining nomi
(masalan, funktsiya yoki manzil)

Yana bir muhim xususiyat - dasturlar tugashi bilan avtomatik ravishda turli qiymatlarni ko'rsatish qobiliyati. Displey buyrug'ining maqsadi nima:

(gdb) displey/format qiymati , bu erda format displey formati, qiymat esa ko'rsatilishi kerak bo'lgan formatdir.

Tasvirlar bilan ishlash uchun quyidagi buyruqlar berilgan:

(gdb) info displey - displey haqidagi ma'lumotlarni ko'rsatadi
(gdb) num - de numni o'chirish - indeksli elementlarni o'chirish
son

Bu asosiy g'oyani tushunish uchun jamoalarning kichik qo'llanmasi bo'ladi.
Ko'proq dumba haqida men bir oz ko'proq ko'rsatmoqchiman. Va esda tuting - bu erda men gdb ning barcha imkoniyatlarining kichik bir qismini berdim, aslida ularda yuz baravar ko'p, shuning uchun o'qing va boshlang.
Men obytsya bor, deb, biz ha prog kerak bo'lmaydi. Mashinangizdagi yo'lni menikidan chetlab o'tmaslik mumkin, hamma narsa siz foydalanadigan operatsion tizimda bo'ladi, agar siz qidirish orqali tezlikni oshirsangiz (buyruq)
toping).

# gdb /usr/bin/ha

Ishga tushirilgandan so'ng siz batafsil ma'lumot olasiz.

GNU gdb 19991004




Bu GDB uchun mutlaqo kafolat emas. Tafsilotlar uchun "kafolatni ko'rsatish" ni kiriting.
Tsei GDB buv "i386-redhat-linux" kabi tweaked ...
(hech qanday disk raskadrovka belgilari topilmadi)...

Ha, chunki biz cheksiz sonli belgilarni ko'rsatishimiz mumkin, agar ularni muharrirdan yuklab olmaganimiz yaxshi bo'lar edi, lekin yana
dasturlar boshqa konsolga yo'naltirilishi mumkin. Yangi terminalni oching, i kimligini kiriting va konsol nomini oching. Chiqish sizning aybingiz
Keling, rasmga qaraylik:

O'q endi unga oddiygina bog'langan.

(gdb) tty /dev/pts/1

Va endi puts() funksiyasiga nuqta qo'yamiz va siz funktsiya haqidagi man ma'lumotlarini tushunishingiz uchun (man buyrug'i)
qo'yadi)

#o'z ichiga oladi
int qo'yadi (const char * s);
puts() s satrini va keyingi yangi qatorni std ga yozadi
tashqariga.

Ko'rib turganingizdek, funksiya ko'rsatilgandek s qatoriga qo'llaniladi. Bu aks bizga kerak bo'lgan narsadir. Biz hali ham unga yopishib qolganmiz.

(gdb) tanaffus qo'yadi
0x8048698 da uzilish nuqtasi 1

I dasturni o'zi ishga tushiring, shunda siz gdb doklarini tekshirishingiz va funktsiyalarni bosmasligingiz mumkin.

(gdb)r
Dasturni ishga tushirish: /usr/bin/yes
0x4006d585 da uzilish nuqtasi 1: ioputs.c fayli, 32-qator.

To‘xtash nuqtasi 1, 0x4006d585 _IO_puts (str=0x8048e59 "y") da ioputs.c:32
32 ioputs.c: Bunday fayl yoki katalog yo'q.
1: x/i $eip 0x4006d585<_IO_puts+21>: mov 0x8(%ebp),%esi

Oh, i o'qi to'xtash nuqtasini yaratib, mo''jizaga aylandi. Biz uchun muhim bo'lgan narsa - va biz uchun muhim bo'lgan narsa boshqa narsa, masalan, funktsiyaning parametri, aniqrog'i u joylashgan manzil. Endi sizga nima kerak?
pul ishlang? To'g'ri, ma'lumotlarni ushbu manzilga yuboring. Shu bilan biz o'zimizning yana bir nechta belgilarni qo'shamiz.

(gdb) set (char)0x8048e59="X"
(gdb) set (char)0x8048e5a="A"
(gdb) set (char)0x8048e5b="K"
(gdb) set (char)0x8048e5c="E"
(gdb) set (char)0x8048e5d="P"

Xo'sh, endi bizning vitvirimizga hayron bo'laylik. Xotirada nima bor:

(gdb) x/3sw 0x8048e59
0x8048e59<_IO_stdin_used+437>: "XAKEP\004\b"
0x8048e61<_IO_stdin_used+445>: ""
0x8048e62<_IO_stdin_used+446>: ""

Endi biz to'xtash nuqtamizni ko'rishimiz mumkin:

(gdb) axborot uzilishi
Num Type Disp Enb Manzil Nima
1 to'xtash nuqtasi y 0x4006d585 ni _IO_puts ichida ioputs.c:32 da saqlaydi
uzilish nuqtasi allaqachon 1 marta urilgan
(gdb) aniq zarbalar
O'chirilgan to'xtash nuqtasi 1

Natijadan bahramand bo'lishingiz uchun vikonni davom ettiraman:

Ana xolos. Aftidan.

(gdb)q
Dastur ishlamoqda. Baribir chiqasizmi? (y yoki n)y

Amaliyot tugagach, o'zingiz qaror qiling va hayotingizdagi muammo HAMMA NARSA ekanligini unutmang.
Robotlarning o'qlari:

Ushbu jarayondan oldin tasdiqlash:

// gdb-ni ishga tushiring
hack@exploit:~ > gdb
GNU gdb 4.18
Mualliflik huquqi 1998 Free Software Foundation, Inc.
GDB - bu GNU General Public License-ga bo'ysunadigan bepul dasturiy ta'minot va
ma'lum shartlar ostida uni o'zgartirish va/yoki uning nusxalarini tarqatish uchun xush kelibsiz.
Shartlarni ko'rish uchun "nusxalashni ko'rsatish" ni kiriting.
Bu GDB uchun mutlaqo kafolat emas. "Kafolatni ko'rsatish" ni kiriting
tafsilotlar.
Qia GDB "i386-suse-linux" sifatida sozlangan.
(gdb) "pid" qo'shing
(gdb) 1127 // misol ilova qiling

Xotirani qidirish:

(gdb) x/d yoki x "manzil" kasrni ko'rsatadi
(gdb) x/100s "manzil" keyingi 100 ta kasrni ko'rsatadi
(gdb) x 0x0804846c 0x0804846c da oʻnli sonni koʻrsatadi
(gdb) x/s "manzil" manzilda satrlarni ko'rsatadi
(gdb) x/105 0x0804846c 0x0804846c da 105 ta qatorni ko'rsatadi
(gdb) x/x "manzil" o'n oltilik manzilni ko'rsatadi
(gdb) x/10x 0x0804846c 0x0804846c da 10 ta manzilni ko'rsatadi
(gdb) x/b 0x0804846c
(gdb) x/10b 0x0804846c-10 baytni 0x0804846c-10 da ko'rsatadi
(gdb) x/10b 0x0804846c+20 baytni 0x0804846c+20 da ko‘rsatadi
(gdb) x/20i 0x0804846c manzilda 20 assembler ko'rsatmalarini ko'rsatadi

Kompilyatsiya qilingan fayldagi barcha bo'limlar ro'yxati:

(gdb) texnik ma'lumotlar bo'limlari // yoki
(gdb) mai i s

Bajariladigan fayl:
`/home/hack/homepage/challenge/buf/basic", fayl turi
elf32-i386.
0x080480f4->0x08048107 da 0x000000f4: .interp ALLOC

0x08048108->0x08048128 da 0x00000108: .note.ABI-tegi
ALLOC FAQAT OʻQILGAN MAʼLUMOTLAR HAS_CONTENTS
0x08048128->0x08048158 da 0x00000128: .xash ALLOC
HAS_CONTENTS MA'LUMOTLARINI FAQAT O'QILISH
0x08048158->0x080481c8 da 0x00000158: .dynsym ALLOC
HAS_CONTENTS MA'LUMOTLARINI FAQAT O'QILISH
0x080481c8->0x08048242 da 0x000001c8: .dynstr ALLOC
HAS_CONTENTS MA'LUMOTLARINI FAQAT O'QILISH
0x08048242->0x08048250 da 0x00000242: .gnu.version
FAQAT OʻQILISh MA’LUMOTLARNI YUKLASH
HAS_CONTENTS

Shlyub manzilida:

(gdb) asosiyni qismlarga ajratish
Asosiy funktsiya uchun assembler kodini tashlab yuborish:
0x8048400

: %ebp tugmasini bosing
0x8048401 : mov %esp,%ebp
0x8048403 : sub $0x408,%esp
0x8048409 : $0xfffffff8,%esp qo'shing
0x804840c : mov 0xc(%ebp),%eax
0x804840f : $0x4,%eax qo'shing
0x8048412 : mov (%eax),%edx
0x8048414 : %edx tugmasini bosing
0x8048415 : lea 0xffffffc00(%ebp),%eax
...

(gdb) break *0x8048414 // misol
0x8048414 da uzilish nuqtasi 1
(gdb) asosiy uzilish // misol
0x8048409 da uzilish nuqtasi 2
(gdb)

GNU Debugger ko'plab UNIX-ga o'xshash tizimlarda ishlaydigan va C, C++, Ada va Fortran kabi keng ko'lamli dasturiy ta'minot dasturlarini boshqaradigan GNU loyihasi uchun portativ vositadir. GNU Debugger - bu GNU General Public License ostida litsenziyalangan dasturiy ta'minot dasturi.

1988 yilda Richard Stallman tomonidan yozilgan GNU Debugger dasturiga asoslangan. U BSD tarqatish bilan birga kelgan DBX muharririga asoslangan edi. 1990 yildan 1993 yilgacha rok. Loyihani Jon Gilmor Cygnus Solutions kompaniyasidagi dastlabki faoliyati davomida boshqargan. Hozirda ishlab chiqish Erkin dasturiy ta'minot jamg'armasining filiali bo'lgan GDB boshqaruv qo'mitasi tomonidan muvofiqlashtirilmoqda.

GNU Debugger texnik tafsilotlari

  • Xususiyatlari

GNU Debugger kompyuterlarda dasturiy ta'minot dasturlarini boshqarish uchun ajoyib xususiyatlarni taklif etadi. Foydalanuvchilar ichki dasturlarni o'zgartirishi va dasturning asl xatti-harakatidan mustaqil ravishda chaqiruv funksiyalarini o'zgartirishi mumkin. GNU Debugger a.out, COFF formatidagi (shu jumladan Windows formatidagi fayllar), ECOFF, XCOFF, ELF, SOM formatidagi siqilgan fayllarni tahlil qilishi va stabs, COFF, ECOFF, DWARF, DWARF2 formatlaridan foydali ma'lumotlarni ajratib olishi mumkin. DWARF2 formati takomillashtirish uchun eng katta imkoniyatlarni taqdim etadi.

GNU Debugger faol ishlab chiqilgan. Misol uchun, 7.0 versiyasida nima bo'lganini ko'rish uchun dekonstruksiya jarayonini kuzatish imkonini beruvchi "aylanuvchi kredit" funksiyasi qo'shildi. Shuningdek, 7.0 versiyasida skriptlarni qo'llab-quvvatlash qo'shildi.

GNU Debugger bilan ishlash uchun boshqa ishlab chiqish vositalari, masalan, xotira sensorlari yaratildi.

  • Ko'p platformali va yangi tizimlarni qo'llab-quvvatlash

GNU Debugger bir nechta platformalar uchun dasturlarni qo'llab-quvvatlash va ishlayotgan seans paytida ular o'rtasida o'tish uchun kompilyatsiya qilinishi mumkin. GNU Debugger (2003) tomonidan qo'llab-quvvatlanadigan protsessorlar: Alpha, ARM, H8/300, System/370, System/390, x86 va x86-64, IA-64 (Itanium), Motorola 68000, MIPS, PA-RISC, PowerPC, SuperH , SPARC, VAX, A29K, ARC, AVR, CRIS, D10V, D30V, FR-30, FR-V, Intel i960, M32R, 68HC11, Motorola 88000, MCORE, MN10200, MN10300, NS32K. (Endi ularning birortasini qo'llab-quvvatlaydigan yangi nashrlar bo'lmaydi.) GNU Debugger ishlay olmaydigan barcha platformalar, agar tizim o'rnatilgan bo'lsa, o'rnatilgan simulyatordan (ARM, AVR protsessorlari) foydalanishni qo'llab-quvvatlashi mumkin, yoki ular uchun ki qo'shish buti chakana sotuvchining kompyuterida ishlaydigan GNU Debugger ostida mukammal ishlashni ta'minlash uchun maxsus kichik dasturlar bilan kompilyatsiya qilinishi mumkin. Yaxshilash uchun kirish fayli, qoida tariqasida, flesh-fayl emas, balki foydali ma'lumotlarni, ayniqsa ELF-ni qo'llab-quvvatlaydigan formatlardan biridagi fayl bo'lib, ulardan ikkitasi proshivka uchun maxsus yordam dasturlari kodi yordamida birlashtirilgan.

  • Yaqin-atrofda

Masofadan sozlanganda, GNU Debugger bir mashinada ishlaydi va o'zgartirilayotgan dastur boshqasida ishlaydi. Aloqa maxsus protokol yordamida ketma-ket port yoki TCP/IP orqali amalga oshiriladi. Nosozliklarni tuzatuvchi bilan o'zaro ishlash protokoli GNU Debugger uchun xos bo'lib, kerakli kichik dasturlarning chiqish kodlari tuzatuvchi arxivlariga kiritilgan. Shu bilan bir qatorda, maqsadli platforma GNU Debugger paketi bilan bir xil protokoldan foydalanadigan gdbserver dasturini ishga tushirishi mumkin, bu o'rnatish nuqtasi uchun past darajadagi funktsiyalarni va registrlar va xotiralarga kirishni ta'minlaydi. yati.

Ushbu rejim o'rnatilgan Linux KGDB yadrosi xususiyatlari bilan o'zaro ishlash uchun mo'ljallangan. Ushbu yordam yordamida ishlab chiquvchi yadroni asosiy dastur sifatida sozlashi mumkin: xotira nuqtalarini o'rnatish, wiki-kod bilan ishlash va o'zgarishlarni ko'rib chiqish. Ilova menejeri Ethernet yoki ketma-ket kabel orqali ulangan ikkita mashinadan iborat bo'lib, biri GNU Debugger, ikkinchisi esa ishlab chiqilayotgan yadro bilan ishlaydi.

  • Koristuvalnitskiy interfeysi

Free Software Foundation mafkurasiga muvofiq, grafik interfeys o'rniga GNU Debugger zamonaviy IDE-larga, boshqa grafik qobiqlarga ulanish yoki standart konsol matn interfeysidan foydalanish imkoniyatini beradi. Uni tashqi dasturlardan olish uchun siz matn qatori tilidan (DDD qobig'ining birinchi versiyalarida bo'lgani kabi), gdb/mi matn tilidan yoki til interfeysidan foydalanishingiz mumkin.

da DDD, cgdb, GDBtk/Insight va GUD rejimi kabi interfeyslar yaratilgan. Quyidagi IDElar GNU Debugger bilan oʻzaro aloqada boʻlishi mumkin:

Dasturlarni samarali ishlab chiqish uchun kompilyatsiya paytida siz foydali ma'lumotlarni yaratishingiz kerak. Ushbu qimmatli ma'lumot ob'ekt faylida saqlanadi; U teri o'zgarishlari yoki funktsiyalari ma'lumotlarining turini va chiqish matnining satr raqamlari va tugaydigan kod manzillari o'rtasidagi munosabatni tavsiflaydi.

Foydali ma'lumotni yaratishni so'rash uchun kompilyatorni ishga tushirishda "-g" tugmachasini kiriting.

Ko'pgina C kompilyatorlari bir vaqtning o'zida "-g" va "-O" kalitlarini qayta ishlay olmaydi. Bunday kompilyatorlar yordamida siz qimmatli ma'lumotlarni o'z ichiga olish uchun optimallashtirilgan fayllarni yarata olmaysiz.

GCC, GNU C kompilyatori optimallashtirilgan kodni yaxshilash uchun "-g" ni "-O" bilan yoki bo'lmasdan rag'batlantiradi. Sizga tavsiya qilamiz Birinchidan Siz dasturlarni kompilyatsiya qilishda "-g" dan foydalandingiz. Siz dasturingizni to'g'ri deb o'ylashingiz mumkin, ammo muvaffaqiyat hissi yo'q.

Agar siz dasturni jarayonlarni qo'llab-quvvatlaydigan oynaning o'rtasida ishga tushirsangiz, ishga tushirish engil jarayonni yaratadi va bu jarayon dasturingizni tugatadi. (Jarayonlarni qo'llab-quvvatlamaydigan tizimlar uchun ishga tushirish dasturingizning boshiga o'tadi.)

Vikonanny dasturlari ularni yaratgan jarayondan olingan ma'lumot shaklida yotadi. GDB siz yaratishingiz kerak bo'lgan ma'lumotlarni belgilash usullarini taqdim etadi oldin dasturni ishga tushirish. (Siz ularni ishga tushirgandan so'ng o'zgartirishingiz mumkin, aks holda bunday o'zgarishlar faqat siz boshlaganingizda dasturingizga qo'llaniladi.) Bu ma'lumotni quyidagi toifalarga bo'lish mumkin: Parametrlar Dasturingiz o'tishi kerak bo'lgan parametrlarni, masalan, ishga tushirish buyrug'ining parametrlarini belgilang. Tizimingizda qobiq bo'lgani uchun u parametrlarni o'tkazish uchun ishlatiladi, shuning uchun ularni tavsiflashda siz boshqa narsalardan foydalanishingiz mumkin (masalan, shablonlarni ochish yoki o'rnini bosuvchi shablonlarni almashtirish). Unix tizimlarida siz SHELL o'rta dasturi o'rniga qaysi qobiq o'rnini bosishini boshqarishingiz mumkin. 4.3-bo'lim Dasturingizga argumentlar. Sereda. Dasturingiz o'z yadrosini GDBda yaratganiga ishonch hosil qiling yoki siz unga oqib tushadigan yadro miqdorini o'zgartirish uchun GDB to'plami muhiti va sozlanmagan muhit buyruqlaridan foydalanishingiz mumkin. bo'lim 4.4 Dasturingizning ishchi o'rtasi. Ish katalogi Sizning dasturingiz ishchi katalogini GDB-ga tashlaydi. GDB ishchi katalogini cd buyrug'i yordamida kiritishingiz mumkin. bo'lim 4.5 Dasturingizning ishchi katalogi. Standart taqdimot va namoyish. Dasturingiz standart kiritish va chiqish uchun GDB bilan bir xil qurilmalardan foydalanishiga ishonch hosil qiling. Siz kiritilgan ma'lumotlarni ishga tushirish buyrug'iga yo'naltirishingiz yoki dasturingiz uchun boshqa qurilmani o'rnatish uchun tty buyrug'idan foydalanishingiz mumkin. bo'lim 4.6 Dasturlarni joriy etish va chiqarish. Oldindan: Agar siz kiritish va chiqishni qayta yo'naltirish ishlashini istasangiz, boshqa dasturlarni ishga tushiradigan dasturlardan chiqish ma'lumotlarini uzatish uchun kanallarni tanlay olmaysiz; Agar siz buni sinab ko'rsangiz, noto'g'ri dasturni o'rnatmaguningizcha butun GDBdan o'tasiz.

Ishga tushirish buyrug'ini berganingizda, dasturingiz ishdan chiqa boshlaydi. Div. bo'lim 5. Dasturni ishlab chiqish va davom ettirish, dasturingizni qanday takomillashtirishni muhokama qilish. Dasturingiz ishga tushishi bilan siz chop etish yoki chaqiruv buyruqlari kabi dastur funksiyalarini chaqirishingiz mumkin. bo'lim 8. Ma'lumotlarni kuzatish.

Simvol faylingiz uchun o'zgartirish vaqti o'zgarganda, GDB belgilarni o'qishni boshlaganda, u o'zining belgilar jadvalini qidiradi va ularni yana o'qiydi. Shu tarzda, GDB sizning aniq ma'lumotlar nuqtalaringizni saqlashga harakat qiladi.

4.3 Dasturingiz uchun argumentlar

Birinchi narsa, GDB tayyorgarlikdan keyin belgilangan jarayon o'rnatilguncha ishlashi kerak - bu noto'g'ri. Agar jarayonlarni run yordamida ishga tushirsangiz, mavjud bo'lganda GDB buyruqlari yordamida bajarish jarayonini kuzatishingiz va o'zgartirishingiz mumkin. Siz bog'lash nuqtalarini kiritishingiz mumkin; Siz dasturdan birma-bir chiqib ketishingiz va asl chiqishni davom ettirishingiz va ma'lumotlar maydonlarini o'zgartirishingiz mumkin. Agar siz yangi GDBga qo'shilganingizdan so'ng tahrirlash jarayonini davom ettirmoqchi bo'lsangiz, davom etish buyrug'idan foydalanishingiz mumkin. detach Qabul qilish jarayonini sozlashni tugatganingizdan so'ng, uni GDB ga ulash uchun detach buyrug'idan foydalanishingiz mumkin. Jarayon uning g'alabasi bilan davom etmoqda. Detach buyrug'idan so'ng, bu jarayon va GDB yana butunlay mustaqil bo'ladi va siz run yordamida boshqa jarayonga qo'shilishga yoki ishga tushirishga tayyorsiz. Agar siz buyruqni tark etganingizdan so'ng yana RET yozsangiz, detach takrorlanmaydi.

Agar siz GDB dan chiqsangiz yoki yangi jarayon ishlayotgan vaqtda ishga tushirish buyrug'idan foydalansangiz, butun jarayonni o'chirib yuborasiz. Aktsiyalar uchun GDB siz ushbu nutqlardan birini yakunlamoqchi bo'lsangiz, tasdiqlashni so'raydi; Tasdiqlash kerakmi yoki yo'qligini o'rnatilgan tasdiqlash buyrug'i yordamida boshqarishingiz mumkin (15.6-bo'lim Keraksiz oldindan ogohlantirish).

4.8 Bolalar jarayonlaridan mahrum qilish

kill GDB ostida dasturingiz o'rnatilgan bola jarayonini toping.

Agar siz saqlanayotgan jarayonni emas, balki xotira dumpini yaxshilashni istasangiz, bu buyruq foydalidir. Dasturdan chiqish vaqtida GDB xotira qoldiqlarini e'tiborsiz qoldiradi.

Ba'zi operatsion tizimlarda, agar sizda administrator tomonidan o'rnatilgan tugunlar mavjud bo'lsa, dasturni GDB-ga o'rnatib bo'lmaydi. Bunday holatda, dasturingizni administrator tomonidan to'xtatilishiga ruxsat berish uchun o'ldirish buyrug'idan foydalanishingiz mumkin.

O'ldirish buyrug'i, agar siz dasturni qayta kompilyatsiya qilishni va qayta bog'lashni xohlasangiz ham foydalidir, chunki boy tizimlarda jarayon oxirida kompilyatsiya qilinayotgan faylni o'zgartirish mumkin emas. Bunday holda, keyingi safar ishga tushirishni kiritganingizda, GDB fayl o'zgarganligini qayd qiladi va belgilar jadvalini qayta o'qiydi (ballaringizni saqlashga harakat qilganda).