Lệnh addr2line trong Linux

Giới thiệu

Trong lab này, bạn sẽ học cách sử dụng lệnh addr2line trong Linux, đây là một công cụ dùng để dịch địa chỉ thành tên file và số dòng. Điều này đặc biệt hữu ích khi làm việc với thông tin gỡ lỗi, chẳng hạn như stack trace hoặc core dump, để xác định vị trí mã nguồn tương ứng với một địa chỉ cụ thể. Bạn sẽ khám phá cú pháp và tùy chọn cơ bản của addr2line, và học cách sử dụng nó để phân giải địa chỉ thành tên hàm và vị trí file nguồn. Lab này bao gồm mục đích của lệnh addr2line, cách sử dụng cơ bản của nó, và cung cấp các ví dụ thực tế để giúp bạn hiểu cách sử dụng hiệu quả công cụ này khi gỡ lỗi các vấn đề trong chương trình của bạn.

Tìm hiểu Mục đích của Lệnh addr2line

Trong bước này, bạn sẽ tìm hiểu về mục đích của lệnh addr2line trong Linux. Lệnh addr2line là một công cụ được sử dụng để dịch địa chỉ thành tên file và số dòng. Nó đặc biệt hữu ích khi làm việc với thông tin gỡ lỗi, chẳng hạn như stack trace hoặc core dump, để xác định vị trí mã nguồn tương ứng với một địa chỉ cụ thể.

Lệnh addr2line nhận một địa chỉ làm đầu vào và sử dụng thông tin gỡ lỗi trong một file object (chẳng hạn như file thực thi hoặc thư viện dùng chung) để xác định tên file và số dòng liên kết với địa chỉ đó. Điều này có thể hữu ích trong việc hiểu ngữ cảnh của một sự cố hoặc vấn đề khác trong một chương trình.

Hãy bắt đầu bằng cách khám phá cách sử dụng cơ bản của lệnh addr2line:

addr2line -e <executable> <address>

Ở đây, <executable> là tên của file thực thi chứa thông tin gỡ lỗi và <address> là địa chỉ thập lục phân mà bạn muốn dịch.

Ví dụ:

addr2line -e /bin/ls 0x4004e0

Ví dụ đầu ra:

/usr/src/debug/coreutils/8.32-r0/coreutils-8.32/src/ls.c:1372

Đầu ra cho thấy rằng địa chỉ 0x4004e0 tương ứng với dòng 1372 trong file /usr/src/debug/coreutils/8.32-r0/coreutils-8.32/src/ls.c.

Thông tin này có thể rất hữu ích khi gỡ lỗi các vấn đề trong một chương trình, vì nó cho phép bạn nhanh chóng xác định vị trí mã nguồn liên kết với một địa chỉ cụ thể.

Khám phá Cú pháp và Tùy chọn Cơ bản của addr2line

Trong bước này, bạn sẽ khám phá cú pháp và tùy chọn cơ bản của lệnh addr2line. Hiểu các tùy chọn có sẵn sẽ giúp bạn sử dụng addr2line hiệu quả hơn khi làm việc với thông tin gỡ lỗi.

Hãy bắt đầu bằng cách xem xét cú pháp cơ bản của lệnh addr2line:

addr2line [options] < address > [ < address > ...]

Dưới đây là một số tùy chọn phổ biến cho lệnh addr2line:

  • -e <executable>: Chỉ định file thực thi chứa thông tin gỡ lỗi.
  • -f: Hiển thị tên hàm tương ứng với mỗi địa chỉ.
  • -C: Giải mã tên symbol C++.
  • -s: Hiển thị tên section cho mỗi địa chỉ.
  • -p: Hiển thị file nguồn và số dòng theo định dạng "file:line".

Ví dụ:

addr2line -e /bin/ls -f 0x4004e0

Ví dụ đầu ra:

ls_file
/usr/src/debug/coreutils/8.32-r0/coreutils-8.32/src/ls.c:1372

Trong ví dụ này, tùy chọn -f được sử dụng để hiển thị tên hàm (ls_file) tương ứng với địa chỉ 0x4004e0.

Bạn cũng có thể cung cấp nhiều địa chỉ cho lệnh addr2line:

addr2line -e /bin/ls 0x4004e0 0x4004f0

Ví dụ đầu ra:

ls_file
/usr/src/debug/coreutils/8.32-r0/coreutils-8.32/src/ls.c:1372
ls_file
/usr/src/debug/coreutils/8.32-r0/coreutils-8.32/src/ls.c:1373

Điều này sẽ hiển thị file nguồn và số dòng cho mỗi địa chỉ được cung cấp.

Bằng cách khám phá các tùy chọn khác nhau có sẵn với lệnh addr2line, bạn có thể tùy chỉnh đầu ra cho phù hợp với nhu cầu gỡ lỗi của mình.

Phân giải Địa chỉ thành Tên Hàm và Vị trí File Nguồn

Trong bước cuối cùng này, bạn sẽ học cách sử dụng lệnh addr2line để phân giải địa chỉ thành tên hàm và vị trí file nguồn. Điều này đặc biệt hữu ích khi làm việc với thông tin gỡ lỗi, chẳng hạn như stack trace hoặc core dump.

Hãy bắt đầu bằng cách tạo một chương trình C đơn giản mà chúng ta có thể sử dụng cho ví dụ này:

cd ~/project
nano hello.c

Thêm đoạn code sau vào file hello.c:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

Bây giờ, hãy biên dịch chương trình với các symbol gỡ lỗi:

gcc -g -o hello hello.c

Tiếp theo, hãy lấy địa chỉ của hàm main:

addr2line -e hello -f 0x4004e0

Ví dụ đầu ra:

main
/home/labex/project/hello.c:3

Đầu ra cho thấy rằng địa chỉ 0x4004e0 tương ứng với hàm main trong file hello.c, tại dòng 3.

Bạn cũng có thể sử dụng lệnh addr2line để phân giải nhiều địa chỉ cùng một lúc:

addr2line -e hello 0x4004e0 0x4004f0

Ví dụ đầu ra:

main
/home/labex/project/hello.c:3
printf
/usr/include/x86_64-linux-gnu/bits/stdio2.h:92

Trong trường hợp này, địa chỉ 0x4004f0 tương ứng với hàm printf, được gọi từ hàm main.

Bằng cách sử dụng lệnh addr2line, bạn có thể nhanh chóng xác định vị trí mã nguồn liên kết với các địa chỉ cụ thể, điều này có thể vô giá khi gỡ lỗi các vấn đề trong chương trình của bạn.

Tóm tắt

Trong lab này, bạn đã học về mục đích của lệnh addr2line trong Linux, được sử dụng để dịch địa chỉ thành tên file và số dòng. Điều này đặc biệt hữu ích khi làm việc với thông tin gỡ lỗi, chẳng hạn như stack trace hoặc core dump, để xác định vị trí mã nguồn tương ứng với một địa chỉ cụ thể. Bạn cũng đã khám phá cú pháp và tùy chọn cơ bản của lệnh addr2line, bao gồm cách chỉ định file thực thi chứa thông tin gỡ lỗi và cách sử dụng các tùy chọn khác nhau để tùy chỉnh hành vi của lệnh.

400+ câu lệnh phổ biến trong Linux