Postupy: vyhledávání Symbol Název a adresa během ladění Linux Kernel
Účel: Toto je krátký příspěvek, ve kterém uvidíme, jak se dívat nahoru symbol názvu (název funkce nebo proměnná) z adresy, která je na výstupu ve formátu jádra dmesg záznamy a naopak.
Poznámka: Vezměte prosím na vědomí, že toto není Postupy, jak ladit jádro Linuxu, když to dělá OOPS nebo Kernel Panic. Může být budu zahrnovat témata, někdy později.
Řekněme, že jste aktualizovat jádro a můžete zaznamenat následující anomálie v dmesg protokolech, i když váš systém se zdá spustit pokutu nejméně pouhým okem:
[ 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
Nyní řekněme, že chcete pochopit, co dělá výše uvedených vysoce technické výstupních prostředků. Pojďme vyzvednutí linky z výše uvedeného se říci, ten v červené barvě a předpokládáme, že tato linka by nám užitečné informace týkající se výše uvedené anomálie, i když to nemusí být případ, protože v aktuální pardon, to je obecně první nebo poslední řádek v backtrace, která poskytla nejvíce užitečné informace o ladění. Pojďme pochopit, jeden po druhém, co každý z těchto sloupců v následujícím řádku znamená, že:
? handle_irq + 0×17 / 0x1b [24.155827] [<c1004dd7>]? Handle_irq + 0 × 17 / 0x1b
[24.155827] je časová razítka informace vytištěna linuxového jádra. To jednoduše znamená, že tato položka byla produkce je cca 24 sekund později po zavedení jádra Linux začal bootování.
, in the System Map table. [<c1004dd7>] Je adresa (řekněme, že pro tuto chvíli) z funkce, handle_irq v systému Mapa tabulce.
handle_irq je název "urážkou" funkce v linuxovém jádře kódu.
0 x 17 je posun (a nikoliv počet řádků), který v podstatě poukazuje na kus kódu ve funkci, která se podílí na výše uvedenou akci.
. 0x1b je velikost funkce handle_irq. ). Odsazení (0 x 17), musí být vždy menší než je velikost funkce (0x1b).
Nyní se pojďme podívat, jak tato informace vztahující se k systémové tabulce Mapa souboru, který je generován při instalaci linuxového jádra.
Dát následující příkaz:
# cat /boot/System.map-2.6.32-bpo.5-686 | grep handle_irq
Budete muset nahradit název mapy jádra systému stolního dokumentaci.
Výstup:
c1004dc0 T handle_irq
c100cffc t intel_pmu_handle_irq
c100d2a4 t p6_pmu_handle_irq
c100d3bd t amd_pmu_handle_irq
Máme zájem v první řadě, protože to je to, co si myslíme, že naše funkce je trestné. that we found in the output above. Nicméně, adresa c1004dc0 není shoduje s adresou (c1004dd7), který se nachází ve výstupu výše. Tak jak jsme se sladit tyto čísla?
ie Zkusme odečíst hexadecimální číslo c1004dc0 z c1004dd7, tj.
c1004dd7 - c1004dc0 = 17
Bingo! Číslo 17 zápasů s výstupem 0 × 17, které jsme získali v anomálii. Takže shrnutí:
. c1004dc0 je počáteční adresa funkce handle_irq.
c1004dd7 je adresa (po přidání 17 k výše uvedené počáteční adresy) na kus kódu ve funkci.
Podobně, můžete tak učinit na cvičení pro další funkce, jako je cpu_idle a start_kernel od výše dmesg výstup.
A je to!













01.01.2011 v 17:15
[...] Více: Linux Kernel Kernel Panic OOPS a ladění systému Mapa | Debianu ... Publikováno v: Jádra ADD [...]
27.dubna 2011 v 23:38
Dobrý den,
Jak ladit kernel panic. Můžete vysvětlit, u mě podrobně příklad.
Rád bych, aby toto řešení 4 následující kernel panic.
VFS: Mounted kořen (nfs filesystem) na zařízení 0:11.
Uvolnění paměti init: 92k
Kernel panic - není synchronizace: Pokus zabít init!
Backtrace:
[] (Dump_backtrace 0 × 0/0 × 114) z [] (dump_stack 0 × 18/0x1c)
R6: c7020000 R5: 00000004 R4: c02a4b88
[] (Dump_stack 0 × 0/0x1c) z [] (panic 0 x4c / 0 × 114)
[] (Panic 0 × 0/0 × 114) z [] (do_exit 0 × 74/0x5c0)
R3: c029321c r2: r1 c7023e34: 00002710 r0: c026bca8
[] (Do_exit 0 × 0/0x5c0) z [] (do_group_exit 0 × 94/0xc8)
[] (Do_group_exit 0 × 0/0xc8) z [] (get_signal_to_deliver 0 x2f0/0x32c)
R4: 0830009f
[] (Get_signal_to_deliver 0 × 0/0x32c) z [] (do_signal 0 × 58/0x65c)
[] (Do_signal 0 × 0/0x65c) z [] (do_notify_resume 0 × 20/0 × 54)
[] (Do_notify_resume 0 × 0/0 × 54) z [] (work_pending 0 X1C / 0 × 20)
R4: 000214e0
Odpovědět na tento komentář
27.dubna 2011 v 23:40
Dobrý den,
Jak ladit kernel panic. Můžete vysvětlit, u mě podrobně příklad.
Chtěl bych požádat o poskytnutí řešení pro následující kernel panic.
VFS: Mounted kořen (nfs filesystem) na zařízení 0:11.
Uvolnění paměti init: 92k
Kernel panic - není synchronizace: Pokus zabít init!
Backtrace:
[] (Dump_backtrace 0 × 0/0 × 114) z [] (dump_stack 0 × 18/0x1c)
R6: c7020000 R5: 00000004 R4: c02a4b88
[] (Dump_stack 0 × 0/0x1c) z [] (panic 0 x4c / 0 × 114)
[] (Panic 0 × 0/0 × 114) z [] (do_exit 0 × 74/0x5c0)
R3: c029321c r2: r1 c7023e34: 00002710 r0: c026bca8
[] (Do_exit 0 × 0/0x5c0) z [] (do_group_exit 0 × 94/0xc8)
[] (Do_group_exit 0 × 0/0xc8) z [] (get_signal_to_deliver 0 x2f0/0x32c)
R4: 0830009f
[] (Get_signal_to_deliver 0 × 0/0x32c) z [] (do_signal 0 × 58/0x65c)
[] (Do_signal 0 × 0/0x65c) z [] (do_notify_resume 0 × 20/0 × 54)
[] (Do_notify_resume 0 × 0/0 × 54) z [] (work_pending 0 X1C / 0 × 20)
R4: 000214e0
Odpovědět na tento komentář
10.10.2012 v 08:01
Pěkné příspěvky. Já pátrám to.
Odpovědět na tento komentář