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!

Være selskabelig, Del!