2010-01-14 9 views
15

Làm thế nào tôi có thể hiển thị các luồng (stacktraces) trong một ứng dụng treo chạy với MONO?Làm cách nào để tạo kết xuất chuỗi bằng MONO?

Tôi biết rằng tôi có thể làm điều đó trong .NET với Managed Stack Explorer (MSE). Bởi vì ứng dụng chỉ treo với MONO mà tôi cần thực hiện với MONO.

Hoặc có bất kỳ ý tưởng nào khác về cách tôi có thể tìm thấy địa điểm bị treo không?

Trả lời

16

Giả sử bạn đang sử dụng Linux/Unix, chứ không phải Windows, gửi tín hiệu SIGQUIT đến chương trình của bạn. Điều này có thể được thực hiện với

kill -QUIT $PID 

trong đó $ PID là pid của chương trình của bạn. Mono sau đó sẽ đổ dấu vết ngăn xếp của tất cả các chủ đề để stdout. Lưu ý rằng mặc dù quá trình vẫn chạy sau này, bạn không nên mong đợi nó vẫn có thể sử dụng/ổn định.

Xem http://en.wikipedia.org/wiki/SIGQUIT đối với một số nền.

0

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.