Biến môi trường LD_DEBUG: Công cụ gỡ lỗi thư viện chia sẻ trên Linux

Công nghệ09 tháng 6, 2026·4 phút đọc

Biến môi trường LD_DEBUG là một công cụ mạnh mẽ nhưng ít được biết đến trên Linux, giúp các nhà phát triển chẩn đoán và khắc phục các lỗi liên quan đến việc tải thư viện chia sẻ (shared libraries). Bài viết này hướng dẫn cách sử dụng biến này để hiển thị thông tin gỡ lỗi chi tiết, đồng thời liệt kê các tùy chọn hữu ích và so sánh với các công cụ khác như strace.

Việc phát triển các hệ thống lớn sử dụng nhiều thư viện chia sẻ (dynamically loaded libraries) đôi khi dẫn đến những lỗi khó chịu và khó chẩn đoán. Những lỗi này thường phát sinh do trên hệ thống tồn tại một vài phiên bản khác nhau của cùng một thư viện, và phiên bản "sai" bị nạp vào thay vì phiên bản mà nhà phát triển mong muốn.

Trước đây, tôi thường giải quyết các vấn đề này một cách khá hiệu quả bằng cách sử dụng lệnh strace (man strace) và kiểm tra xem các thư viện nào đang được truy cập. Tuy nhiên, có một cách thức hiệu quả hơn nhiều nhưng có lẽ không được nhiều người biết đến để gỡ lỗi các vấn đề khi nạp thư viện chia sẻ: đó chính là biến môi trường LD_DEBUG.

Nếu biến môi trường LD_DEBUG được thiết lập, bộ liên kết động (dynamic linker) của Linux sẽ đổ ra thông tin gỡ lỗi, giúp giải quyết hầu hết các vấn đề về nạp thư viện rất nhanh chóng. Để xem các tùy chọn có sẵn, chỉ cần chạy bất kỳ chương trình nào với biến được thiết lập là help, ví dụ:

LD_DEBUG=help cat

Các tùy chọn hợp lệ cho biến môi trường LD_DEBUG bao gồm:

  • libs: hiển thị các đường dẫn tìm kiếm thư viện.
  • reloc: hiển thị quá trình xử lý định vị lại (relocation processing).
  • files: hiển thị tiến trình xử lý cho file đầu vào.
  • symbols: hiển thị quá trình xử lý bảng ký hiệu (symbol table).
  • bindings: hiển thị thông tin về việc liên kết ký hiệu (symbol binding).
  • versions: hiển thị các phụ thuộc phiên bản.
  • all: kết hợp tất cả các tùy chọn trước đó.
  • statistics: hiển thị thống kê định vị lại.
  • unused: xác định các DSO (Shared Object) không được sử dụng.
  • help: hiển thị thông tin trợ giúp này và thoát.

Để chuyển đầu ra gỡ lỗi vào một file thay vì đầu ra tiêu chuẩn (standard output), một tên file có thể được chỉ định bằng cách sử dụng biến môi trường LD_DEBUG_OUTPUT.

Các công cụ hữu ích khác

Ngoài LD_DEBUG, còn có nhiều công cụ khác hữu ích để xử lý các vấn đề liên quan đến linking:

  • Chương trình strace cung cấp cái nhìn sâu sắc về tất cả các cuộc gọi hệ thống, bao gồm cả việc tìm kiếm và mở các thư viện động.
  • Chương trình ldd giải quyết các phụ thuộc của thư viện động.
  • Lệnh objdump -x YOURFILE | grep NEEDED liệt kê các bản ghi trong chương trình hoặc thư viện cho biết các thư viện khác nào là cần thiết.
  • Chương trình patchelf giúp thay đổi rpath của một tệp thực thi ELF một cách dễ dàng, thay đổi thứ tự tìm kiếm tích hợp sẵn.
  • Biến môi trường LD_PRELOAD cho phép thay thế thư viện động một cách dễ dàng.

Tương đương trên Windows

Lưu ý rằng biến này chỉ có sẵn trên Linux. Trên hệ điều hành MS Windows, thông tin tương tự có thể thu được bằng cách bật tùy chọn "Show Loader Snaps" sử dụng chương trình gflags.exe để bật tính năng này và sau đó sử dụng windbg để xem nhật ký.

Ví dụ:

  1. Cài đặt Windows SDK cho gflags và windbg: winget install Microsoft.WindowsSDK.10.0.19041 (hoặc tải xuống từ trang web của Microsoft).
  2. Bật ShowLoaderSnaps cho một tệp thực thi. Ví dụ: để bật cho notepad.exe, hãy thực hiện trong Powershell: &"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /i notepad.exe +sls
  3. Thực thi notepad.exe dưới ứng dụng WinDbg. Nhật ký chi tiết về việc nạp DLL sẽ được hiển thị.

Ví dụ chạy thử

Dưới đây là một ví dụ về việc chạy lệnh với LD_DEBUG=all cat:

LD_DEBUG=all cat
28504:
28504:	file=libc.so.6 [0];  needed by cat [0]
28504:	find library=libc.so.6 [0]; searching
28504:	 search path=/home/user/s/lib/tls/x86_64:/home/user/s/lib/tls:...		(LD_LIBRARY_PATH)
28504:	  trying file=/home/user/s/lib/tls/x86_64/libc.so.6
...
28504:	 search cache=/etc/ld.so.cache
28504:	  trying file=/lib/x86_64-linux-gnu/libc.so.6
...
28504:	checking for version `GLIBC_2.4' in file /lib/x86_64-linux-gnu/libc.so.6 [0] required by file cat [0]
...

Đầu ra của lệnh này cũng rất hữu ích để theo dõi các vấn đề về hiệu năng do việc nạp động quá mức, v.v. Vì vậy, đây là một công cụ rất đơn giản nhưng cực kỳ hữu ích để gỡ lỗi các vấn đề ld trên Linux!

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗