Hướng dẫn cách sử dụng gdbserver để gỡ lỗi từ xa trên Linux

Cập nhật lần cuối: 14/01/2026
tác giả: Isaac
  • gdbserver hoạt động như một tác nhân từ xa của GDB để điều khiển các tiến trình trên máy khác thông qua TCP hoặc cổng nối tiếp.
  • Để gỡ lỗi từ xa, điều quan trọng là phải biên dịch với biểu tượngHãy sử dụng gdb phù hợp và cấu hình đúng đường dẫn ký hiệu và phông chữ.
  • gdbserver cung cấp chế độ đơn tiến trình và chế độ đa tiến trình, đồng thời tích hợp với WinDbg và QEMU để gỡ lỗi nhân hệ điều hành.
  • Các tùy chọn như --debug, sysroot và giới hạn kích thước giá trị giúp chẩn đoán sự cố và ổn định các phiên làm việc.

Gỡ lỗi từ xa với gdbserver

Nếu bạn lập trình bằng C hoặc C++ trong Linux và bạn chưa từng động đến gdbserverBạn đang bỏ lỡ một trong những công cụ hữu ích nhất để gỡ lỗi các tiến trình từ xa, cho dù trên máy chủ, hệ thống nhúng, hay thậm chí trong máy ảo hoặc WSL. gdbserver không phải là thứ gì đó "kỳ diệu" hay chỉ dành cho chuyên gia, mà chỉ đơn giản là một chương trình nhỏ giao tiếp với gdb và điều khiển việc thực thi tiến trình mục tiêu.

Ý tưởng cốt lõi rất đơn giản.: trên máy tính nơi chương trình nhị phân bạn muốn gỡ lỗi đang chạy (the mục tiêu) bạn khởi động gdbserver; trên máy tính làm việc của bạn (the chủ nhàBạn khởi động gdb hoặc thậm chí WinDbg với hỗ trợ giao thức gdb. Cả hai đều kết nối qua TCP hoặc cổng nối tiếp, và từ đó bạn có thể đặt điểm dừng, kiểm tra biến, xem ngăn xếp hoặc theo dõi quá trình thực thi từng bước như thể chương trình đang chạy trên máy tính của bạn.

gdbserver là gì và khi nào thì nên sử dụng nó?

gdbserver là gì?

gdbserver là một "tác nhân" gỡ lỗi từ xa cho GNU gdb.Chức năng của nó rất đặc thù: nó chạy trên máy tính nơi chương trình cần phân tích đang chạy, điều khiển tiến trình đó (hoặc các tiến trình đó), và giao tiếp với máy khách gdb nằm trên một máy tính khác (hoặc trên cùng một máy tính) thông qua kết nối từ xa.

Trong sử dụng hàng ngày, gdbserver được dùng trong hai trường hợp điển hình.Gỡ lỗi phần mềm chạy trong môi trường nhúng (bộ định tuyến, bo mạch với hệ điều hành Linux rút gọn, thiết bị) IOTv.v.) và gỡ lỗi các tiến trình trên các máy Linux từ xa, nơi không thuận tiện hoặc đơn giản là không thể có một gdb "đầy đủ" với tất cả các thư viện và ký hiệu.

Trên thực tế, gdbserver xử lý các tác vụ như sau: Đọc và ghi các thanh ghi tiến trình và bộ nhớ, điều khiển quá trình thực thi (tiếp tục, tạm dừng, từng bước), quản lý điểm dừng và gửi tất cả dữ liệu này đến gdb bằng giao thức từ xa của GDB. Triết lý này rất giống với các công cụ như OpenOCD, hoạt động như một cầu nối giữa gdb và... phần cứng Bên ngoài, với sự khác biệt là gdbserver chạy trên cùng một hệ thống nơi tệp nhị phân chạy.

Nếu bạn đến từ những môi trường Cửa sổ Điều này cũng rất thú vị để biết Các trình gỡ lỗi như WinDbg có thể giao tiếp với gdbserver trên Linux, vì vậy bạn có thể gỡ lỗi các tiến trình người dùng trên Linux từ WinDbg bằng cách sử dụng hỗ trợ gỡ lỗi từ xa thông qua giao thức gdb mà Microsoft đã tích hợp trong các phiên bản gần đây.

Các yêu cầu cơ bản để gỡ lỗi với gdb và gdbserver

Yêu cầu để sử dụng gdbserver

Trước khi bắt đầu gỡ lỗi từ xa, bạn cần hiểu rõ mối quan hệ giữa máy chủ và máy đích.. Các mục tiêu Đây là máy tính nơi chương trình cần gỡ lỗi chạy và nơi gdbserver sẽ được thực thi; chủ nhà Đây là máy mà bạn sẽ dùng để chạy gdb (hoặc WinDbg) và nơi bạn sẽ có mã nguồn và, tốt hơn hết, các ký hiệu gỡ lỗi.

Điểm khởi đầu thiết yếu là biên dịch mã nhị phân với các ký hiệu.Trong GCC hoặc g++, điều này được thực hiện bằng cờ. -gvà thường thì cũng nên tắt các tính năng tối ưu hóa (ví dụ như với -O0Điều này cho phép trình gỡ lỗi hiển thị chính xác hơn các biến, macro và cấu trúc mã. Đối với các macro cụ thể, bạn có thể sử dụng các cấp độ gỡ lỗi cao hơn, chẳng hạn như -g3.

Ở phía máy chủ, bạn sẽ cần một phiên bản gdb tương thích. Với kiến ​​trúc mục tiêu. Để gỡ lỗi hệ thống nhúng kiến ​​trúc MIPS, ARM hoặc các kiến ​​trúc khác, bạn phải sử dụng gdb của bộ công cụ biên dịch chéo tương ứng (ví dụ: arm-none-eabi-gdb o gdb-multiarchvà, nếu cần, cấu hình kiến ​​trúc và thứ tự byte với lệnh như set arch y set endian.

Về kết nối, gdbserver hỗ trợ hai loại chính.Giao tiếp nối tiếp (rất phổ biến trong phần cứng nhúng, thông qua UART) và TCP/IP, thuận tiện nhất khi thiết bị đích nằm trên cùng một mạng hoặc là một máy Linux có thể truy cập được qua mạng. Trong cả hai trường hợp, lệnh được sử dụng từ gdb. target remote để kết nối đến điểm cuối được gdbserver cung cấp.

Các cách khởi động gdbserver: chế độ đơn tiến trình và đa tiến trình

chế độ thực thi gdbserver

gdbserver có thể hoạt động theo hai cách chính. Khi nói về gỡ lỗi ở chế độ người dùng: nó được liên kết trực tiếp với một tiến trình duy nhất hoặc như một "máy chủ tiến trình" cho phép liệt kê và gắn kết với các tiến trình hệ thống khác nhau.

Ở chế độ xử lý đơn lẻ Bạn khởi chạy gdbserver, chỉ định máy chủ:cổng và chương trình cần chạy. Trong một ví dụ đơn giản trên máy tính để bàn Linux, bạn có thể làm như sau:

Chỉ huy: gdbserver localhost:3333 foo

Với lệnh đó, gdbserver sẽ khởi chạy tệp nhị phân. foo và anh ấy vẫn tiếp tục lắng nghe tại cổng 3333Cho đến khi gdb từ xa kết nối, chương trình vẫn bị dừng; khi gdb kết nối với target remote localhost:3333Quá trình này bắt đầu được kiểm soát bởi máy nghiền.

Trong chế độ đa tiến trình (máy chủ tiến trình), tùy chọn này được sử dụng. --multiTrong trường hợp này, gdbserver không trực tiếp khởi chạy bất kỳ chương trình nào, mà chỉ đơn giản là lắng nghe các kết nối đến và cho phép máy khách (gdb hoặc WinDbg) quản lý tiến trình nào cần tạo hoặc gắn vào:

  Google ra mắt Gemini Code Assist: trợ lý lập trình miễn phí hỗ trợ AI

Chỉ huy: gdbserver --multi localhost:1234

Khi làm việc với WinDbg trên Linux, chế độ đa nhiệm này đặc biệt hữu ích.Bởi vì từ chính WinDbg, bạn có thể liệt kê các tiến trình trên hệ thống từ xa, xem PID, người dùng và dòng lệnh, và kết nối đến tiến trình mà bạn quan tâm, tương tự như cách thực hiện với máy chủ tiến trình. dbgsrv.exe trên Windows.

Gỡ lỗi từ xa với gdbserver và gdb từng bước một.

Hãy cùng xem xét một ví dụ rất điển hình để dễ hình dung hơn.Gỡ lỗi một ứng dụng đơn giản trên cùng một máy (máy chủ và máy đích trùng khớp) bằng cách sử dụng gdbserver để mô phỏng kịch bản từ xa.

Đầu tiên, bạn viết và biên dịch một chương trình nhỏ.Ví dụ, một vòng lặp đơn giản in ra bộ đếm:

Chỉ huy: gcc -g foo.c -o foo

Điểm mấu chốt ở đây là lá cờ. -gThao tác này bổ sung thông tin gỡ lỗi cần thiết vào tệp nhị phân để gdb có thể hiển thị các dòng mã, tên biến, kiểu dữ liệu, v.v. Trong môi trường biên dịch chéo "thực sự", bạn sẽ thực hiện quá trình biên dịch này bằng bộ công cụ biên dịch chéo và sau đó sao chép cả tệp nhị phân và các phần phụ thuộc của nó vào hệ thống đích.

Bước tiếp theo là khởi động gdbserver trên máy mục tiêu.Nếu máy chủ và máy đích là cùng một máy, thì:

Chỉ huy: gdbserver localhost:3333 foo

Bạn sẽ thấy một thông báo tương tự như sau: “Tiến trình foo đã được tạo; pid = XXXX; Đang lắng nghe trên cổng 3333”. Điều này cho thấy gdbserver đã tạo tiến trình và đang chờ gdb kết nối. Nếu bạn đang sử dụng hệ thống yêu cầu nhiều quyền hơn (ví dụ: để gắn vào các tiến trình hệ thống), bạn có thể cần chạy lệnh với quyền quản trị viên. sudoNhưng thận trọng khi cấp phép luôn là điều khôn ngoan. nguồn gốc đến thiết bị khử lưu huỳnh.

Trên máy chủ, bạn khởi động gdb và chỉ định tệp thực thi cục bộ. (cùng một chương trình đang chạy trên máy đích, hoặc một bản sao y hệt có chứa ký hiệu):

Chỉ huy: gdb foo

Sau khi vào bên trong gdb, bạn thiết lập kết nối từ xa với:

Chỉ huy: target remote localhost:3333

Tại thời điểm đó, gdb tải các ký hiệu từ tệp nhị phân cục bộ.Nó đồng bộ hóa với gdbserver và giành quyền kiểm soát tiến trình đang thực sự chạy dưới gdbserver. Từ đó, quy trình diễn ra như thường lệ: các lệnh như break để thiết lập các điểm đột phá, continue, step, next, print để kiểm tra các biến số, backtrace để kiểm tra pin, v.v.

Kết nối với các tiến trình đang chạy bằng gdbserver

Không phải lúc nào bạn cũng muốn khởi chạy chương trình từ đầu.Thông thường, bạn sẽ muốn tham gia vào một quy trình đang chạy (ví dụ: một quy trình nào đó). httpd một Router(một tiến trình nền hệ thống hoặc một dịch vụ sản xuất).

Thông thường người ta sẽ sử dụng tùy chọn này. --attach từ gdbserverTruyền vào cổng mà nó sẽ lắng nghe và PID của tiến trình mục tiêu. Ví dụ, trên một bộ định tuyến mà bạn đã sao chép một gdbserver được biên dịch cho kiến ​​trúc của nó, bạn có thể làm như sau:

Chỉ huy: gdbserver localhost:3333 --attach <pid_de_httpd>

Ở phía máy chủ, bạn sẽ sử dụng phiên bản gdb hỗ trợ kiến ​​trúc của bộ định tuyến., ví dụ gdb-multiarchCấu hình kiến ​​trúc và thứ tự byte trước:

Chỉ huy: set arch mips
set endian big

Tiếp theo, bạn chỉ định tệp cục bộ chứa các ký hiệu. của tệp nhị phân từ xa (ví dụ: file httpdvà, nếu cần, bạn cho gdb biết vị trí thực sự của tệp nhị phân trên thiết bị đích bằng lệnh sau: set remote exec-file /usr/bin/httpdCuối cùng, cũng như trước đây, bạn kết nối với:

Chỉ huy: target remote 192.168.0.1:3333

Sau khi được gắn vàoBạn có thể đặt điểm dừng (breakpoint) trên các hàm cụ thể (ví dụ: break checkFirmware), tiếp tục thực thi và để luồng hoạt động bình thường của chương trình (ví dụ: tải firmware từ giao diện web) kích hoạt điểm dừng.

Sử dụng gdbserver với WinDbg trên Linux

Trong những năm gần đây, Microsoft đã bổ sung hỗ trợ gỡ lỗi các tiến trình Linux trong WinDbg. Sử dụng gdbserver làm hệ thống phụ trợ. Chức năng này được thiết kế cho các trường hợp bạn làm việc trên Windows nhưng mã nguồn chạy trên Linux (bao gồm cả WSL).

Để gỡ lỗi một tiến trình Linux cụ thể bằng WinDbg sử dụng gdbserverQuy trình sẽ diễn ra như sau: đầu tiên bạn xác định vị trí tiến trình mục tiêu trên máy Linux bằng một lệnh như sau: ps -A (ví dụ một python3 (đang chạy), sau đó bạn khởi chạy gdbserver trên máy mục tiêu:

Chỉ huy: gdbserver localhost:1234 python3

Nếu môi trường yêu cầu, bạn có thể cần sử dụng sudo gdbserver ...Với các biện pháp phòng ngừa an ninh như thường lệ. Khi gdbserver cho biết nó đang “Lắng nghe trên cổng 1234”, trong WinDbg hãy vào “Tệp / Kết nối với trình gỡ lỗi từ xa” và chỉ định chuỗi kết nối thuộc loại sau:

Chỉ huy: gdb:server=localhost,port=1234

WinDbg sử dụng một "trình điều khiển" giao thức gdb nhỏ để giao tiếp với gdbserver. và, một khi kết nối được thiết lập, nó sẽ dừng lại ở điểm đó. khởi động của tiến trình. Từ đó, bạn có thể sử dụng các cửa sổ ngăn xếp, mô-đun, bộ nhớ, điểm dừng, cũng như các lệnh như... k để xem pin hoặc lm để liệt kê các mô-đun (lưu ý rằng một số lệnh yêu cầu định dạng PE chứ không phải ELF, vì vậy chúng có thể hiển thị dữ liệu lạ trong một số trường hợp).

gdbserver và máy chủ xử lý WinDbg

Ngoài trường hợp xử lý đơn tiến trình, WinDbg có thể kết nối với gdbserver hoạt động như một máy chủ xử lý. để hoạt động tương tự hơn với cách thức hoạt động với các tiến trình Windows từ xa. Ở chế độ này, gdbserver được khởi chạy với --multi và không có quy trình liên quan:

  Cách tốt nhất để kích hoạt chế độ năng lượng thấp trên iPhone

Chỉ huy: sudo gdbserver --multi localhost:1234

Từ WinDbg, chọn “Tệp / Kết nối với máy chủ xử lý”. và bạn tái sử dụng chuỗi kết nối gdb:server=localhost,port=1234Khi kết nối được thiết lập, bạn có thể liệt kê các tiến trình Linux khả dụng và chọn tiến trình mình muốn hoặc thậm chí khởi chạy một tiến trình mới.

Có một chi tiết nhỏ cần lưu ý.WinDbg phân biệt giữa "máy chủ tiến trình" và "mục tiêu đơn lẻ" tùy thuộc vào việc gdbserver đã được gắn vào một tiến trình nào đó khi kết nối hay chưa. Nếu bạn để gdbserver được gắn vào một tiến trình, đóng WinDbg, rồi thử kết nối lại, nó có thể không được nhận diện là máy chủ tiến trình, và bạn có thể cần phải khởi động lại gdbserver.

Để kết thúc phiên giao dịch của người phục vụ xử lýThông thường, chỉ cần nhấn CTRL+D trong cửa sổ dòng lệnh nơi gdbserver đang chạy và dừng gỡ lỗi từ WinDbg là đủ. Trong một số trường hợp đặc biệt, nếu có vấn đề về đồng bộ hóa, có thể cần phải đóng hoàn toàn trình gỡ lỗi và khởi động lại gdbserver từ đầu.

Quản lý ký hiệu và mã nguồn trong gỡ lỗi từ xa

Một trong những yếu tố quan trọng để việc gỡ lỗi từ xa trở nên thuận tiện là phải giải quyết tốt vấn đề về ký hiệu và phông chữ.Nếu không có các ký hiệu, việc điều hướng ngăn xếp hoặc đặt điểm dừng trên các hàm cụ thể sẽ trở nên vô cùng khó khăn.

Trong các trường hợp sử dụng gdb + gdbserver thông thường, việc giữ một bản sao của tệp thực thi kèm ký hiệu trên máy chủ là lý tưởng. (chưa lược bỏ) và cây mã nguồn. gdb không yêu cầu tệp nhị phân từ xa phải chứa các ký hiệu; chỉ cần tệp cục bộ mà bạn tải bằng file Tìm đường dẫn đến tệp thực thi từ xa tương ứng với độ lệch.

Trong thế giới gỡ lỗi WinDbg và Linux, các dịch vụ như DebugInfoD cũng đã xuất hiện.cho phép hiển thị các ký hiệu và phông chữ qua HTTP. WinDbg có thể sử dụng các đường dẫn đặc biệt thuộc loại này. DebugInfoD*https://debuginfod.elfutils.org cả trong .sympath.srcpath Tải xuống các ký hiệu DWARF và mã nguồn nhị phân ELF của Linux theo yêu cầu.

Trong một ví dụ cụ thể với WSL, nơi mã người dùng nằm dưới C:\Users\Bob\Bạn có thể nói với WinDbg:

Chỉ huy: .sympath C:\Users\Bob\
.srcpath C:\Users\Bob\

Và nếu bạn cũng muốn sử dụng DebugInfoD cho các tệp nhị phân hệ thống:

Chỉ huy: .sympath+ DebugInfoD*https://debuginfod.elfutils.org
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org

Với cấu hình này, khi bạn kiểm tra ngăn xếp hoặc vào các hàm libc,WinDbg có thể cố gắng tải xuống các ký hiệu DWARF tương ứng và, nếu máy chủ cũng cung cấp mã nguồn, sẽ hiển thị mã nguồn với độ chi tiết đáng kể, mặc dù về mặt nội bộ, bộ công cụ Windows không xử lý ELF và DWARF một cách "nguyên bản" như PE và PDB.

Ví dụ thực tế: gỡ lỗi chương trình C++ bằng gdbserver và WinDbg

Một ví dụ minh họa là một ứng dụng C++ nhỏ viết lời chào lên màn hình., được biên dịch trong WSL với các ký hiệu gỡ lỗi. Hãy tưởng tượng một chương trình dành riêng một std::array<wchar_t, 50> và sao chép một tin nhắn dài hơn vào đó, khiến văn bản bị cắt ngắn và các ký tự xuất hiện. ???? ở cuối

Sau khi biên dịch với một cái gì đó tương tự như thế này:

Chỉ huy: g++ DisplayGreeting.cpp -g -o DisplayGreeting

Bạn khởi động gdbserver với tệp nhị phân đó.:

Chỉ huy: gdbserver localhost:1234 DisplayGreeting

Trong WinDbg, bạn kết nối bằng chuỗi gdb:server=localhost,port=1234 Và, sau khi phiên làm việc được thiết lập và đường dẫn ký hiệu và phông chữ được cấu hình, bạn sẽ đặt điểm dừng trong DisplayGreeting!mainbạn có thể sử dụng dx greeting Kiểm tra mảng cục bộ và xem kích thước của nó (50 vị trí), đồng thời kiểm tra trực quan trong tab bộ nhớ hoặc trong chế độ xem biến xem lời chào bị cắt cụt như thế nào.

Điểm hay của ví dụ này là nó chứng minh rằng, ngay cả khi WinDbg không hỗ trợ đầy đủ tất cả các định dạng ELF/DWARF, thì vẫn có thể thực hiện được.Bạn có thể duyệt qua các ngăn xếp, kiểm tra kiểu dữ liệu, đặt điểm dừng theo tên hàm và điều hướng mã C++ một cách khá dễ dàng bằng cách sử dụng gdbserver như một công cụ hỗ trợ từ xa.

Gỡ lỗi nhân Linux bằng qemu và gdb

gdbserver không chỉ được sử dụng ở chế độ người dùng; nó còn có những kịch bản rất mạnh mẽ ở chế độ nhân hệ điều hành.Đặc biệt là khi bạn kết hợp QEMU với hỗ trợ gỡ lỗi. Mặc dù ở đây vai trò của “gdbserver” được thực hiện bởi tùy chọn riêng của QEMU, nhưng cách tiếp cận là giống nhau: một đầu chạy hệ thống cần gỡ lỗi và mở cổng gdb; đầu kia là gdb hoặc một trình gỡ lỗi sử dụng giao thức từ xa.

Để gỡ lỗi nhân hệ điều hành, bạn cần biên dịch nó với các tùy chọn gỡ lỗi cụ thể.: kích hoạt việc tạo thông tin gỡ lỗi (CONFIG_DEBUG_INFO), các tập lệnh nhân GDB (CONFIG_GDB_SCRIPTS) và chế độ gỡ lỗi riêng của nhân hệ điều hành (CONFIG_DEBUG_KERNELCũng cần vô hiệu hóa các tùy chọn loại bỏ ký hiệu trong quá trình liên kết, chẳng hạn như "Loại bỏ các ký hiệu do trình biên dịch tạo ra trong quá trình liên kết".

Sau khi biên dịch, bạn sẽ nhận được một tệp nhị phân. vmlinux “không bị lột trần”Đây là phiên bản bạn sẽ sử dụng từ gdb. Bạn cũng cần một initramfs cơ bản, mà bạn có thể tạo ra bằng một lệnh như sau:

Chỉ huy: mkinitramfs -o ramdisk.img

Sau đó, bạn khởi động QEMU với các tham số gỡ lỗi.Một ví dụ điển hình bao gồm tùy chọn -gdb tcp::1234 để mở một điểm cuối từ xa tương thích với gdb, và -S để máy ảo khởi động ở trạng thái tạm dừng ngay từ đầu. Bạn cũng chỉ định nhân hệ điều hành với -kernel vmlinux, The -initrd ramdisk.img, bộ nhớ với -m 512 và bạn thường chuyển hướng bảng điều khiển đến ttyS0 để quản lý mọi thứ từ thiết bị đầu cuối.

  Cách cập nhật Edge lên phiên bản mới nhất trên Windows 11: hướng dẫn từng bước đầy đủ

QEMU bị tạm giữ chờ gdbTừ máy chủ, bạn khởi động gdb và trỏ đến... vmlinux và bạn kết nối với target remote localhost:1234Từ đó, bạn có thể thiết lập các điểm dừng sớm, ví dụ như... hb start_kernelvà kiểm soát việc thực thi bằng các lệnh như sau: c (tiếp tục) và nhấn CTRL+C để tạm dừng lần nữa.

Những thay đổi và điểm khác biệt gần đây trong gdb và gdbserver

Trong các bản phân phối hiện đại như Red Hat Enterprise Linux 8, có một số thay đổi trong gdb và gdbserver đáng để lưu ý.đặc biệt nếu bạn đang sử dụng các phiên bản trước đó hoặc có các tập lệnh phân tích đầu ra của trình gỡ lỗi.

Một mặt, gdbserver hiện khởi động các tiến trình "thấp hơn" bằng cách sử dụng shell.Giống như gdb, chức năng này cho phép mở rộng và thay thế biến trên dòng lệnh. Nếu vì bất kỳ lý do nào bạn cần tắt chức năng này, có các thiết lập cụ thể được ghi trong RHEL 8 để quay lại chế độ trước đó.

Một số nội dung cũng đã bị loại bỏ hoặc thay đổi.Hỗ trợ gỡ lỗi cho các chương trình Java được biên dịch với gcj, chế độ tương thích HP-UX XDB, các lệnh như sau: set remotebaud (được thay thế bởi) set serial baud) hoặc khả năng tương thích với một định dạng cũ hơn nhất định của stabsHơn nữa, việc đánh số luồng không còn áp dụng cho toàn cục nữa, mà theo từng luồng "cấp dưới", và hiển thị như sau: inferior_num.thread_num, với các biến tiện ích mới như $_gthread Để chỉ định mã định danh toàn cầu.

Một tính năng mới quan trọng khác là khả năng điều chỉnh. max-value-sizeTham số này giới hạn lượng bộ nhớ mà gdb có thể cấp phát để hiển thị nội dung của một giá trị. Giá trị mặc định là 64 KiB, vì vậy việc cố gắng in các mảng lớn hoặc cấu trúc khổng lồ có thể dẫn đến cảnh báo "giá trị quá lớn" thay vì hiển thị toàn bộ bộ nhớ khả dụng.

Cách gdb xử lý cũng đã được điều chỉnh. sysrootGiá trị mặc định hiện tại là target:Điều này có nghĩa là đối với các tiến trình từ xa, nó sẽ trước tiên cố gắng tìm các thư viện và ký hiệu trên hệ thống đích. Nếu bạn muốn nó ưu tiên các ký hiệu cục bộ, bạn nên chạy lệnh sau: set sysroot với tuyến đường mà bạn quan tâm trước khi thực hiện target remote.

Về lịch sử lệnh, biến môi trường hiện đang được sử dụng là GDBHISTSIZE thay vì HISTSIZEĐiều này cho phép bạn tinh chỉnh thời gian lưu giữ các lệnh đã nhập trong các phiên gỡ lỗi mà không ảnh hưởng đến hoạt động của các ứng dụng khác sử dụng thư viện đọc dòng.

Mẹo về quy trình làm việc và khắc phục sự cố với gdbserver

Để có quy trình làm việc thoải mái, có một số mô hình thường hoạt động rất hiệu quả. Khi phát triển phần mềm cho hệ thống nhúng hoặc máy chủ từ xa, bước đầu tiên là tự động hóa việc biên dịch ký hiệu và triển khai mã nhị phân lên mục tiêu càng nhiều càng tốt. Bằng cách này, bạn luôn biết phiên bản nào của tệp thực thi đang chạy và có sẵn bản sao ký hiệu trên máy chủ.

Trong môi trường có nhiều core gây lỗi, việc học cách sử dụng gdb ở chế độ batch rất hữu ích., với những lá cờ như --batch, --ex y -x để tự động chạy các lệnh trên một danh sách các lõi và xử lý dấu vết thực thi của chúng từ các tập lệnh (ví dụ: trong PythonĐiều này cho phép bạn nhanh chóng lọc ra các sự cố lặp lại, nhóm các lỗi theo dấu vết ngăn xếp, v.v.

Khi có sự cố xảy ra với kết nối từ xa, tùy chọn này sẽ được kích hoạt. --debug gdbserver là người bạn tốt nhất của bạnVí dụ, nếu bạn khởi động một máy chủ xử lý lệnh với:

Chỉ huy: gdbserver --debug --multi localhost:1234

Bảng điều khiển gdbserver sẽ hiển thị dấu vết chi tiết về những gì đang xảy ra. Ở cấp độ giao thức từ xa, điều này bao gồm các gói tin đến, lỗi định dạng, sự cố mất kết nối, v.v. Điều này rất hữu ích khi máy chủ gdb của bạn đột ngột ngắt kết nối, một tiến trình bị lỗi ngay khi đặt điểm dừng hoặc giao diện người dùng đồ họa (GUI) gỡ lỗi của bạn gửi thứ gì đó mà gdbserver không hiểu.

Trong các trường hợp như bộ định tuyến TP-Link, nơi bạn gắn gdbserver vào một tiến trình quan trọng như... httpdViệc các điểm dừng (breakpoint) tạo ra tình trạng tranh chấp tài nguyên hoặc các bộ giám sát (watchdog) khiến tiến trình bị "kẹt" quá lâu trong trình gỡ lỗi là khá phổ biến. Trong những trường hợp này, có thể cần phải điều chỉnh các tín hiệu bị chặn, các luồng được kiểm soát và, nếu cần, sửa đổi cấu hình hệ thống (thời gian chờ, bộ giám sát phần cứng) để cho phép các phiên gỡ lỗi dài hơn.

Sử dụng gdbserver hiệu quả đòi hỏi sự kết hợp của nhiều yếu tố khác nhau.Biên dịch với các ký hiệu phù hợp, chọn gdb chính xác cho kiến ​​trúc, cấu hình đường dẫn ký hiệu và mã nguồn, hiểu hai chế độ chính của gdbserver (đơn tiến trình và đa tiến trình), và đừng ngại sử dụng chế độ pull. --debug Khi kết nối không hoạt động như mong đợi. Với nền tảng đó, việc gỡ lỗi các ứng dụng chạy trên hệ thống Linux từ xa, bộ định tuyến hoặc máy ảo với nhân tùy chỉnh từ máy tính của bạn trở nên khá thường xuyên và trên hết, vô cùng hữu ích.