2012-04-16 22 views
18

Nếu bạn may mắn khi mô-đun hạt nhân của bạn gặp sự cố, bạn sẽ nhận được một bản ghi có nhiều thông tin, chẳng hạn như các giá trị trong sổ đăng ký, v.v. Một thông tin như vậy là theo dõi ngăn xếp (Điều này cũng đúng với các vùng lõi, nhưng ban đầu tôi đã hỏi điều này cho các mô-đun hạt nhân). Lấy ví dụ này:Làm thế nào để sử dụng tốt stack trace (từ hạt nhân hoặc lõi dump)?

[<f97ade02>] ? skink_free_devices+0x32/0xb0 [skin_kernel] 
[<f97aba45>] ? cleanup_module+0x1e5/0x550 [skin_kernel] 
[<c017d0e7>] ? __stop_machine+0x57/0x70 
[<c016dec0>] ? __try_stop_module+0x0/0x30 
[<c016f069>] ? sys_delete_module+0x149/0x210 
[<c0102f24>] ? sysenter_do_call+0x12/0x16 

Tôi đoán là +<number1>/<number2> có liên quan đến chức năng bù trừ lỗi đã xảy ra. Đó là, bằng cách kiểm tra con số này, có lẽ nhìn vào đầu ra lắp ráp tôi sẽ có thể tìm ra dòng (tốt hơn chưa, hướng dẫn) trong đó lỗi này đã xảy ra. Đúng không?

Câu hỏi của tôi là, hai số này chính xác là gì? Làm thế nào để bạn sử dụng chúng?

Trả lời

19
skink_free_devices+0x32/0xb0 

này có nghĩa là hướng dẫn vi phạm là 0x32 byte từ khi bắt đầu của hàm skink_free_devices() đó là dài 0xB0 byte trong tổng số.

Nếu bạn biên dịch kernel với -g kích hoạt, sau đó bạn có thể nhận được số dòng bên trong chức năng nơi sự kiểm soát nhảy bằng công cụ addr2line hoặc tốt của chúng tôi cũ gdb

Something như thế này

$ addr2line -e ./vmlinux 0xc01cf0d1 
/mnt/linux-2.5.26/include/asm/bitops.h:244 
or 
$ gdb ./vmlinux 
... 
(gdb) l *0xc01cf0d1 
0xc01cf0d1 is in read_chan (include/asm/bitops.h:244). 
(...) 
244  return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr >> 5])) != 0; 
(...) 

Vì vậy, chỉ cần cung cấp địa chỉ bạn muốn kiểm tra đến addr2line hoặc gdb và họ sẽ cho bạn biết số dòng trong tệp nguồn nơi chức năng vi phạm hiện diện Xem this bài viết cho đầy đủ chi tiết

EDIT:vmlinux là phiên bản nén của hạt nhân được sử dụng để gỡ lỗi và thường được tìm thấy @/lib/modules/$(uname -r)/build/vmlinux miễn là bạn đã xây dựng kernel từ các nguồn. vmlinuz mà bạn tìm thấy ở /boot là kernel nén và có thể không thể là hữu ích trong việc gỡ lỗi

+0

Tôi KHÔNG biết bạn có thể gdb chính linux! Điều này thật tuyệt! – Shahbaz

+0

'vmlinux' ở đâu? Tôi nghĩ rằng đó sẽ là hạt nhân Linux chính nó (trong/boot) nhưng đó là 'vmlinuz ...' và addr2line nói "Định dạng tập tin không được công nhận" Không phải là một việc lớn mặc dù, như tôi quan tâm nhiều hơn trong các mô-đun của riêng tôi. – Shahbaz

+0

@Shahbaz vmlinuz chỉ là phiên bản nén và/hoặc bị tước bỏ của vmlinux'. BOth nói chung sẽ nằm trong thư mục '/ boot'. Tôi không có hộp linux của tôi với tôi để kiểm tra ngay bây giờ. Google xung quanh cho hai :) Dưới đây là một số người mới bắt đầu. [One] (http://superuser.com/questions/62575/where-is-vmlinux-on-my-ubuntu-installation) và [Hai] (http://superuser.com/questions/298826/how-do -i-uncompress-vmlinuz-to-vmlinux) –

1

Đối với người dùng Emacs, here 's là một chế độ chính để dễ dàng chuyển xung quanh trong stack trace (sử dụng addr2line nội bộ).

Tuyên bố từ chối: Tôi đã viết nó :)

+0

Bây giờ chỉ để làm cho một cho ViM ... – Shahbaz

+0

Có một cái gì đó cho vim (xin lỗi cho necro): https://github.com/rzwisler/oops_trace.vim/blob/master/plugin/oops_trace.vim – stellarhopper

Các vấn đề liên quan