2013-04-02 32 views
12

Tôi có một chương trình lớn, được viết bằng C# và chạy trên các hệ thống Linux sử dụng Mono, thỉnh thoảng bị treo và gây ra quá trình mono.bin.Gỡ lỗi sau khi chết của một chương trình được biên dịch bởi Mono AOT

Tôi chạy gdb trên một số tệp kết xuất lõi, nhưng nó không hữu ích vì backtraces không có tên của hàm C# trong chúng. Theo số this discussion I found:

Nó sẽ không hoạt động. Thông tin bắt buộc để xây dựng ngăn xếp được quản lý các dấu vết được chứa trong cấu trúc dữ liệu thời gian chạy và chỉ có có sẵn khi chương trình đang chạy. Bạn có thể AOT ứng dụng của bạn, sau đó bạn sẽ có nhiều dấu vết có thể sử dụng hơn.

Vì vậy, tôi đã làm. Tôi đã biên soạn tất cả các tệp C# DLL và EXE của tôi. Sử dụng tùy chọn --aot=write-symbols. Đối với một phiên bản thử nghiệm của chương trình của tôi là crashes on purpose vì vậy tôi có thể kiểm tra xem điều này có làm cho backtraces hữu ích hơn không. Và cho đến nay, nó đã không. Các vết lùi từ các chủ đề chính trông giống như:

#0 0xb7fc8402 in __kernel_vsyscall() 
#1 0x00556df0 in raise() from /lib/libc.so.6 
#2 0x00558701 in abort() from /lib/libc.so.6 
#3 0x080e59b5 in ??() 

chủ đề khác có:

#0 0xb7fc8402 in __kernel_vsyscall() 
#1 0x005f6753 in poll() from /lib/libc.so.6 
#2 0xb6f735a7 in Mono_Unix_UnixSignal_WaitAny() 
    from /opt/novell/mono/lib/libMonoPosixHelper.so 
#3 0xb5416578 in ??() 

Và đề khác dường như đã được nhàn rỗi (trong nanosleep, pthread_cond_timedwait, pthread_cond_wait, sem_timedwait, hoặc sem_wait). Nhưng điều tất cả các backtraces có điểm chung là chúng kết thúc với điều đó gây phiền nhiễu in ??() và không bao giờ liệt kê bất kỳ tên hàm nào từ mã "của tôi".

Tôi nghĩ rằng điều này liên quan đến một số thông báo mà gdb được in khi khởi động; ví dụ:

Reading symbols from /xyz/mono/log4net.dll.so...(no debugging symbols found)...done. 
Loaded symbols for /xyz/mono/log4net.dll.so 
Reading symbols from /xyz/mono/Contoso.Util.dll.so...(no debugging symbols found)...done. 
Loaded symbols for /xyz/mono/Contoso.Util.dll.so 
Reading symbols from /xyz/mono/Contoso.Printing.dll.so...(no debugging symbols found)...done. 
Loaded symbols for /xyz/mono/Contoso.Printing.dll.so 
Reading symbols from /xyz/mono/Contoso.LegacyDataConverter.dll.so...(no debugging symbols found)...done. 
Loaded symbols for /xyz/mono/Contoso.LegacyDataConverter.dll.so 

Tại sao tất cả các tệp *.dll.so có "không tìm thấy biểu tượng gỡ lỗi"? Do các DLLs mình cần phải được xây dựng trong "gỡ lỗi" chế độ hoặc một cái gì đó?

Và thông thường hơn, có cách nào để có được dấu vết ngăn xếp được quản lý từ vùng kết xuất lõi Mono không? (Nếu không sử dụng mono_pmip, vì nó chỉ khả dụng khi quá trình đang chạy.)

+0

Sẽ có một gói trong kho lưu trữ của bạn có tên là "Mono Runtime - Debugging symbols" hoặc tương tự. Tìm nó, cài đặt nó và sau đó thử gỡ lỗi. –

+0

Có một gói có tên là 'mono-addon-core-debuginfo' (dành cho CentOS). Tôi cho rằng đó là nó. – dan04

+0

Như một nỗ lực mương cuối cùng nếu bạn thực sự không thể sửa chữa nó, bạn có thể chạy các ứng dụng dưới 'rượu vang '? Không phải là một giải pháp lý tưởng nhưng nếu bạn thực sự bị mắc kẹt nó có thể làm việc. – Rots

Trả lời

2

Tôi không biết gì về mono .. Nhưng nhìn vào stacktrace được cung cấp .. nó hiển thị không thể nhận được Biểu tượng cho thời gian chạy đơn. ở đây là link cho phép gỡ rối bằng gdb. Bạn cần đơn thời gian chạy với các ký hiệu tức là so thư viện có ký hiệu ... Vì vậy, bạn cần cài đặt mono-runtime-dbg ... Bạn có thể sử dụng các công cụ như apt-get, yum, wget để cài đặt nó.

Tôi có unbuntu cài đặt .. mà cho thấy sau đầu ra ....

$ apt-cache search mono-runtime-dbg 
mono-runtime-dbg - Mono runtime, debugging symbols 

Then 
$ apt-get install mono-runtime-dbg 

Hy vọng bạn tìm thấy nó hữu ích ...

3

Nó sẽ có thể để thiết lập suspend-on-sigserv sau đó đính kèm khi tai nạn quá trình ? Tôi giả định đây là một môi trường sống nên không thể thực hiện được.

Nếu bạn có thể làm điều đó, bạn sẽ có thể tìm thấy thông tin bạn đang theo dõi.

Từ docs:

MONO_DEBUG

Nếu đặt, cho phép một số tính năng của bộ thực thi hữu ích để gỡ lỗi. Biến này phải chứa danh sách các tùy chọn gỡ lỗi được phân cách bằng dấu phẩy. Hiện nay, các tùy chọn sau được hỗ trợ:

...

đình chỉ-on-SIGSEGV

Tùy chọn này sẽ đình chỉ chương trình khi một SIGSEGV bản địa nhận được. Điều này rất hữu ích cho việc gỡ lỗi các sự cố không xảy ra dưới gdb, vì một tiến trình trực tiếp chứa nhiều thông tin hơn một tệp lõi.

Các vấn đề liên quan