Set up :
NOTE: nếu bạn debug kernel cũ thì các bạn có thể tải bản ubuntu old release hoặc cài kernel, trong bài viết này mình sẽ cài kernel cũ.
- Máy ảo linux ( ở đây mình dùng Ubuntu 16.04 LTS)
- kernel ( ở đây mình debug kernel linux 4.4.0-31.50 )
Đầu tiên mình tải source về để compile và install kernel
có 2 cách:
- một là các bạn lên trang http://ddebs.ubuntu.com/pool/main/l/linux/ để tải và cài đặt
- hai là dùng lệnh ( ví dụ )
apt-get install linux-source-4.4.0=4.4.0-31.50
ở bài viết này mình sẽ instal theo cách 2.
sau khi tải source về rồi mình cd vào nơi download ( mặc định là ở /usr/src/ ) ta sẽ thấy file nén. giải nén ra và cd vào thư mục vừa giải nén.
Tiếp theo mình copy file .config của kernel hiện tại vào thư mục kernel vừa giải nén trước khi compile kernel
$ cp /boot/config-$(uname -r) .config
Tiến hành compile:
$ make
trong lúc compile sẽ hiện ra các câu hỏi cho việc cấu hình kernel, các bạn trả lời theo câu hỏi [y/n/?]
sau khi trả lời hết đống câu hỏi đó, bạn có thể cài đặt modules bằng lệnh
$ make modules_install
ok tới đây là mình có thể instal kernel được rồi
$ sudo make install
Note: việc này mất nhiều thời gian, mình làm mất cả buổi để nhìn nó chạy.
Tiếp đến ta update lại cho boot:
sudo update-initramfs -c -k <phiên bản kernel> ví dụ : sudo update-initramfs -c -k 4.4.13
update lại grub:
sudo update-grub
cuối cùng là restart lại máy ảo.
Tiếp tục cd vào thư mục chứa kernel
ví dụ : $ cd /usr/src/linux-source-4.4.0
ta sẽ thấy có file vmlinux dùng để debug lúc sau.
ta dùng qemu để tạo connect và dùng gdb để attach vào
$ qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -nographic -s
Note:
-kernel : ta dẫn đường dẫn tới file bzImage để debug
-nographic để disable video settting. cái này tắt đi để tránh bị lỗi. thường là do mình dùng terminal chứ ko dùng giao diện
-s : khởi động gdbserver trên port 1234
NOTE: qemu không nhận lênh ctrl+c nên muốn quit thì nhấn ctrl+a, sau đó nhấn c để vô qemu promt , rồi nhấn q (quit) là được
ATTACHING GDB TO QEMU
Rồi giờ mình sẽ attach vào:
$ gdb vmlinux
nếu gặp cái này
warning: File "/home/nick/linux/scripts/gdb/vmlinux-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load". To enable execution of this file add add-auto-load-safe-path /path/to/linux/scripts/gdb/vmlinux-gdb.py line to your configuration file "/home/<username>/.gdbinit".
thì dùng lệnh này :
echo "add-auto-load-safe-path `pwd`/scripts/gdb/vmlinux-gdb.py" >> ~/.gdbinit
qemu lắng nghe ở port 1234 ( options -s) ta dùng lệnh
pwndbg> target remote :1234
tới đây là attach vào được rồi, giờ thì mình debug thôi 😀
Một suy nghĩ 1 thoughts on “[Tutorial] Debug kernel Linux trên VMware bằng gdb + qemu”