Cũng có thể nhanh chóng lấy dấu vết ngăn xếp được quản lý bằng GDB. Thực hiện gdb
; sử dụng sudo nếu bạn không root hoặc gỡ lỗi một quá trình thuộc sở hữu của người dùng của bạn.
Execute kịch bản này mà tôi nhận được từ các trang debugging Mono trên mono-project.org:
handle SIGXCPU SIG33 SIG35 SIGPWR nostop noprint
define mono_stack
set $mono_thread = mono_thread_current()
if ($mono_thread == 0x00)
printf "No mono thread associated with this thread\n"
else
set $ucp = malloc (sizeof (ucontext_t))
call (void) getcontext ($ucp)
call (void) mono_print_thread_dump ($ucp)
call (void) free ($ucp)
end
end
Nếu bạn thích bạn có thể thả các lệnh này trong ~/.gdbinit
của bạn, do đó bạn không cần phải sao chép và dán tất cả thời gian.
Tiếp theo, gắn với PID của bạn:
attach 12345
Lưu ý rằng toàn bộ quá trình hiện đang dừng lại vì vậy nếu bạn đang làm điều này trong sản xuất thì nên kịch bản này vì vậy nó càng nhanh càng tốt.
Để nhận dấu vết ngăn xếp, hãy thực hiện mono_stack
như được xác định ở trên. Lưu ý rằng bạn sẽ không thấy đầu ra trong gdb nhưng trong stdout. Nếu bạn chạy quy trình của mình bằng cách mới nổi, bạn chỉ có thể chỉnh sửa công việc mới nổi để sử dụng console log
để đăng nhập vào /var/log/upstart
.
Tuy nhiên, bạn có thể quan tâm đến một chuỗi khác với chuỗi chính của mình. Để làm như vậy, hãy thực hiện info threads
để lấy danh sách chủ đề của bạn và thread 2
để chuyển sang chuỗi # 2. Để biết thêm thông tin về gỡ lỗi chuỗi, hãy xem debugging programs with multiple threads trong tài liệu GDB.
Khi bạn đã hoàn tất, hãy thực hiện quit
và chương trình của bạn sẽ tiếp tục hoạt động.
Nguồn
2016-08-31 12:31:22