HOWTO: Opslag Symbol Navn og adresse under Linux Kernel Debugging
Formål: Dette er et kort indlæg, hvor vi vil se, hvordan du ser op et symbol navn (funktion eller en variabel) fra den adresse, som det outputted i kernen dmesg logs og omvendt.
Bemærk: Bemærk, at dette ikke er en HOWTO om, hvordan man debug Linux Kernel når den gør en OOPS eller Kernel Panic. Kan være jeg vil dække de emner, på et senere tidspunkt.
Lad os sige, at du opgradere din kerne, og du bemærker følgende anomali i din dmesg logs, selvom dit system ser ud til at starte fint mindst med det blotte øje:
[ 24.155180] irq 17: nobody cared (try booting with the "irqpoll" option)
[ 24.155284] Pid: 0, comm: swapper Not tainted 2.6.32-bpo.5-686 #1
[ 24.155373] Call Trace:
[ 24.155463] [<c106cf75>] ? __report_bad_irq+0x24/0x69
[ 24.155554] [<c106cf7c>] ? __report_bad_irq+0x2b/0x69
[ 24.155644] [<c106d0a1>] ? note_interrupt+0xe7/0x13e
[ 24.155734] [<c106d5cf>] ? handle_fasteoi_irq+0x7a/0x97
[ 24.155827] [<c1004dd7>] ? handle_irq+0x17/0x1b
[ 24.155915] [<c1004659>] ? do_IRQ+0x38/0x89
[ 24.156002] [<c10037f0>] ? common_interrupt+0x30/0x38
[ 24.156096] [<c10400d8>] ? ftrace_raw_output_workqueue_insertion+0x80/0x8c
[ 24.156192] [<c104f06e>] ? tick_nohz_stop_sched_tick+0x34a/0x36e
[ 24.156285] [<c1002367>] ? cpu_idle+0x67/0xa4
[ 24.156375] [<c13bf7fc>] ? start_kernel+0x318/0x31d
[ 24.156461] handlers:
[ 24.156539] [<f7cc3855>] (usb_hcd_irq+0x0/0x71 [usbcore])
[ 24.156755] Disabling IRQ #17
Lad os nu sige at du vil forstå, hvad der gør de ovennævnte meget tekniske output midler. Lad os pickup en linje fra ovennævnte ud siger den ene i den røde farve, og vi antager, at denne linje kan give os nyttige oplysninger vedrørende ovennævnte anomali, selv om det måske ikke er tilfældet, fordi i en aktuel oops, er det generelt den første eller den sidste linje i backtrace der ydede det mest værdifulde debugging information. Lad os forstå én efter én, hvad hver af disse kolonner i følgende linie betyder:
? handle_irq + 0×17 / 0x1b [24.155827] [<c1004dd7>]? Handle_irq + 0 × 17 / 0x1B
[24.155827] er det tidsstempler oplysninger udskrives af Linux Kernel. Det betyder blot, at denne linje var output cirka 24 sekunder senere efter Linux Kernel begyndte opstart.
, in the System Map table. [<c1004dd7>] Er adressen (lad os bare sige for nu) af funktionen, handle_irq i System Kort bordet.
handle_irq er navnet på den "fornærme"-funktionen i Linux Kernel kode.
0 × 17 er offset (og ikke Line Number), som dybest set påpeger til det stykke af koden i funktionen, der var involveret i ovennævnte aktion.
. 0x1B er størrelsen af den funktion, handle_irq. ). Forskydningen (0 × 17) bør altid være mindre end størrelsen af funktionen (0x1B).
Lad os nu se, hvordan denne information relateret til System Kort bordet fil, der oprettes, når du installerer Linux Kernel.
Giv følgende kommando:
# cat /boot/System.map-2.6.32-bpo.5-686 | grep handle_irq
Du bliver nødt til at erstatte navnet på din Kernel System Kort tabellen fil i overensstemmelse hermed.
Output:
c1004dc0 T handle_irq
c100cffc t intel_pmu_handle_irq
c100d2a4 t p6_pmu_handle_irq
c100d3bd t amd_pmu_handle_irq
Vi er interesseret i den første linje, da det er hvad vi tror, at vores fejlende funktion er. that we found in the output above. Men adressen c1004dc0 ikke matcher med adressen (c1004dd7), som vi fandt i outputtet ovenfor. Så hvordan kan vi forene disse tal?
ie Lad os prøve at trække hex nummer c1004dc0 fra c1004dd7 dvs
c1004dd7 - c1004dc0 = 17
Bingo! Tallet 17 kampe med output, 0 × 17, som vi fik i anomali. Så for at opsummere:
. c1004dc0 er udgangspunktet adresse funktionen handle_irq.
c1004dd7 er adressen (efter tilsætning 17 til ovenstående start adressen) på det stykke af koden i funktion.
Tilsvarende kan du gøre disse øvelse for andre funktioner som cpu_idle og start_kernel fra ovennævnte dmesg output.
Det var det!













1 januar 2011 kl 17:15
[...] Mere: Linux Kernel OOPS og Kernel Panic Debugging System Kort | Debian ... Posted in: Kerner ADD [...]
April 27, 2011 kl 11:38
Hej,
Sådan debug kernen panik. Kan u forklare mig i detaljer med et eksempel.
Jeg vil gerne give løsningen 4 følgende kernel panik.
VFS: Mounted root (nfs filsystem) på enhedens 00:11.
Frigørelse init hukommelse: 92K
Kernel panik - ikke synkronisering: Forsøgte at dræbe init!
Backtrace:
[] (Dump_backtrace +0 × 0/0 × 114) fra [] (dump_stack +0 × 18/0x1c)
r6: c7020000 r5: 00000004 r4: c02a4b88
[] (Dump_stack +0 × 0/0x1c) fra [] (panik +0 x4c / 0 × 114)
[] (Panik +0 × 0/0 × 114) fra [] (do_exit +0 × 74/0x5c0)
r3: c029321c r2: c7023e34 r1: 00.002.710 r0: c026bca8
[] (Do_exit +0 × 0/0x5c0) fra [] (do_group_exit +0 × 94/0xc8)
[] (Do_group_exit +0 × 0/0xc8) fra [] (get_signal_to_deliver +0 x2f0/0x32c)
R4: 0830009f
[] (Get_signal_to_deliver +0 × 0/0x32c) fra [] (do_signal +0 × 58/0x65c)
[] (Do_signal +0 × 0/0x65c) fra [] (do_notify_resume +0 × 20/0 × 54)
[] (Do_notify_resume +0 × 0/0 × 54) fra [] (work_pending +0 X1C / 0 × 20)
R4: 000214e0
Svar på denne kommentar
April 27, 2011 kl 23:40
Hej,
Sådan debug kernen panik. Kan u forklare mig i detaljer med et eksempel.
Jeg vil gerne anmode om at levere den løsning for følgende kernel panik.
VFS: Mounted root (nfs filsystem) på enhedens 00:11.
Frigørelse init hukommelse: 92K
Kernel panik - ikke synkronisering: Forsøgte at dræbe init!
Backtrace:
[] (Dump_backtrace +0 × 0/0 × 114) fra [] (dump_stack +0 × 18/0x1c)
r6: c7020000 r5: 00000004 r4: c02a4b88
[] (Dump_stack +0 × 0/0x1c) fra [] (panik +0 x4c / 0 × 114)
[] (Panik +0 × 0/0 × 114) fra [] (do_exit +0 × 74/0x5c0)
r3: c029321c r2: c7023e34 r1: 00.002.710 r0: c026bca8
[] (Do_exit +0 × 0/0x5c0) fra [] (do_group_exit +0 × 94/0xc8)
[] (Do_group_exit +0 × 0/0xc8) fra [] (get_signal_to_deliver +0 x2f0/0x32c)
R4: 0830009f
[] (Get_signal_to_deliver +0 × 0/0x32c) fra [] (do_signal +0 × 58/0x65c)
[] (Do_signal +0 × 0/0x65c) fra [] (do_notify_resume +0 × 20/0 × 54)
[] (Do_notify_resume +0 × 0/0 × 54) fra [] (work_pending +0 X1C / 0 × 20)
R4: 000214e0
Svar på denne kommentar
10 oktober 2012 kl 08:01
Nice-stillinger. Jeg søger det.
Svar på denne kommentar