Trong linux, tôi có thể sử dụng GDB để gỡ lỗi một quy trình hiện đang chạy không?
Trong linux, tôi có thể sử dụng GDB để gỡ lỗi một quy trình hiện đang chạy không?
Câu trả lời:
Đúng. Sử dụng attach
lệnh. Kiểm tra liên kết này để biết thêm thông tin. Nhập help attach
trên bảng điều khiển GDB sẽ cho kết quả sau:
(gdb) help attach
Đính kèm vào quy trình hoặc tệp bên ngoài GDB. Lệnh này gắn với một mục tiêu khác, cùng loại với
target
lệnh " " cuối cùng của bạn ("info files
" sẽ hiển thị ngăn xếp mục tiêu của bạn). Lệnh có thể lấy đối số là id quy trình, tên quy trình (với id quy trình tùy chọn làm hậu tố) hoặc tệp thiết bị. Đối với id quy trình, bạn phải có quyền gửi tín hiệu cho quy trình và nó phải có cùng một uid hiệu quả như trình gỡ lỗi. Khi sử dụng "attach
" cho một quy trình hiện có, trình gỡ lỗi sẽ tìm chương trình đang chạy trong quy trình, tìm kiếm trước trong thư mục làm việc hiện tại hoặc (nếu không tìm thấy ở đó) bằng cách sử dụng đường dẫn tìm kiếm tệp nguồn (xemdirectory
lệnh ""). Bạn cũng có thể sử dụngfile
lệnh "" để chỉ định chương trình và tải bảng ký hiệu của nó.
LƯU Ý: Bạn có thể gặp khó khăn khi gắn vào một tiến trình do tính bảo mật được cải thiện trong nhân Linux - ví dụ: gắn vào con của một trình bao từ một trình bao khác.
Bạn có thể cần đặt /proc/sys/kernel/yama/ptrace_scope
tùy thuộc vào yêu cầu của mình. Nhiều hệ thống hiện mặc định bằng 1
hoặc cao hơn.
The sysctl settings (writable only with CAP_SYS_PTRACE) are:
0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
process running under the same uid, as long as it is dumpable (i.e.
did not transition uids, start privileged, or have called
prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
unchanged.
1 - restricted ptrace: a process must have a predefined relationship
with the inferior it wants to call PTRACE_ATTACH on. By default,
this relationship is that of only its descendants when the above
classic criteria is also met. To change the relationship, an
inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
an allowed debugger PID to call PTRACE_ATTACH on the inferior.
Using PTRACE_TRACEME is unchanged.
2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.
3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
PTRACE_TRACEME. Once set, this sysctl value cannot be changed.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
.
Bạn có thể đính kèm vào một tiến trình đang chạy với gdb -p PID
.
Đúng. Bạn có thể làm:
gdb program_name program_pid
Một phím tắt sẽ là (giả sử chỉ một phiên bản đang chạy):
gdb program_name `pidof program_name`
program_name
hoạt động nếu bạn đang ở trong cùng một thư mục với tệp nhị phân. Tôi nghĩ rằng một đường dẫn đến tệp nhị phân sẽ hoạt động nếu bạn ở trong một thư mục khác.
-p
phía trước của program_id
? Ngoài ra, có thể cần chạy gdb với sudo để đính kèm vào một tiến trình đang chạy.
Lệnh sử dụng là gdb attach pid
nơi pid là id tiến trình của tiến trình bạn muốn đính kèm vào.
Có bạn có thể. Giả sử một quá trình foo
đang chạy ...
ps-chính mình | grep foo tìm số PID gdb -a {số PID}
Nếu muốn đính kèm một tiến trình, tiến trình này phải có cùng một chủ sở hữu. Gốc có thể gắn vào bất kỳ quy trình nào.
ps -elf dường như không hiển thị PID. Tôi khuyên bạn nên sử dụng thay thế:
ps -ld | grep foo
gdb -p PID
Cách dễ nhất là cung cấp id quy trình .
gdb -p `pidof your_running_program_name`
Vui lòng nhận danh sách đầy đủ các tùy chọn trong man gdb
lệnh.
Trong trường hợp có nhiều tiến trình cho cùng một chương trình đang chạy, thì lệnh sau sẽ liệt kê các tiến trình.
ps -C program -o pid h
<number>
Sau đó, id quy trình đầu ra (số) có thể được sử dụng làm đối số cho gdb.
gdb -p <process id>