Re: FreeBSD и (k)gdb

abrek

смотрю я crash dump от FreeBSD и вижу:

(kgdb) info stack
0xc0175e76 in dumpsys
0xc0175c40 in boot
0xc0176074 in poweroff_wait
0xc025ff07 in trap_fatal
0xc025fbc9 in trap_pfault
0xc025f7ab in trap
0xc021dfe0 in acquire_lock
0xc0222230 in softdep_update_inodeblock
0xc021d0e2 in ffs_update
0xc022563e in ffs_sync
0xc01a6a1f in sync
0xc01759da in boot
0xc0176074 in poweroff_wait
0xc025ff07 in trap_fatal
0xc025fbc9 in trap_pfault
0xc025f7ab in trap
0xc01942c3 in m_tag_delete_chain
0xc0194392 in m_tag_copy_chain
0xc0193a44 in m_dup_pkthdr
0xc01d6d62 in ip_forward
0xc01d5b93 in ip_input
0xc01d5f77 in ipintr
0xc0254f19 in swi_net_next
(kgdb) frame 16
0xc01942c3 in m_tag_delete_chain
(kgdb) disass
Dump of assembler code for function m_tag_delete_chain:
0xc01942b4 <m_tag_delete_chain>: push %ebp
0xc01942b5 <m_tag_delete_chain+1>: mov %esp,%ebp
0xc01942b7 <m_tag_delete_chain+3>: push %esi
0xc01942b8 <m_tag_delete_chain+4>: push %ebx
0xc01942b9 <m_tag_delete_chain+5>: mov 0x8(%ebp%esi
0xc01942bc <m_tag_delete_chain+8>: mov 0xc(%ebp%ebx
0xc01942bf <m_tag_delete_chain+11>: test %ebx,%ebx
0xc01942c1 <m_tag_delete_chain+13>:
jne 0xc01942d6 <m_tag_delete_chain+34>
0xc01942c3 <m_tag_delete_chain+15>: mov 0x28(%esi%ebx
0xc01942c6 <m_tag_delete_chain+18>: test %ebx,%ebx
0xc01942c8 <m_tag_delete_chain+20>:
je 0xc01942e3 <m_tag_delete_chain+47>
0xc01942ca <m_tag_delete_chain+22>:
jmp 0xc01942d6 <m_tag_delete_chain+34>


дальше неинтересно
в исходнике (не уверен правда, что именно от этой версии, но не суть пока):

void
m_tag_delete_chain(struct mbuf *m, struct m_tag *t)
{
struct m_tag *p, *q;
KASSERT(m, ("m_tag_delete_chain: null mbuf";
if (t != NULL)
p = t;
else
p = SLIST_FIRST(&m->m_pkthdr.tags); /* Вот здесь лажа и случилась */
if (p == NULL)
return;
while q = SLIST_NEXT(p, m_tag_link != NULL)
m_tag_delete(m, q);
m_tag_delete(m, p);
}


Внимание, вопрос: как добраться до значения переменной m, лежащей в %esi?

state7401281

Внимание, вопрос: как добраться до значения переменной m, лежащей в %esi?
что значит добраться?

state7401281

если тебе ее значение интересует, сделай dump куска памяти начиная esi

abrek

Интересует, что лежало в esi в момент page fault.
После page fault функция trap помещает это значение в стек, и начинает заниматься своим делом.
Отладчик умеет разбирать фреймы в стеке, но как заставить его показать адрес нужного фрейма?

state7401281

а trap не дебужиться? могу посоветовать дебагер с дизассемблером в интеловском стиле, по управлению он был похож на досовый debug.exe. как называется не помню, точно есть под линукс, когда он мне был нужен я его нашел. (я в bsd и прочем никогда не дебужил ядро)

state7401281

page fault здесь происходит?

0xc01942c3 <m_tag_delete_chain+15>: mov 0x28(%esi%ebx

Оставить комментарий
Имя или ник:
Комментарий: