2008-09-22 23 views
17

Tôi sử dụng pstack để phân tích tệp kết xuất lõi trong SolarisPhân tích bãi Solaris Core

Làm cách nào khác để phân tích kết xuất lõi từ solaris?

Có thể sử dụng các lệnh nào để thực hiện việc này?

Thông tin nào khác sẽ có sẵn từ bãi chứa?

Trả lời

17

Bạn có thể sử dụng trình gỡ lỗi mô-đun Solaris, mdb hoặc dbx. mdb đi kèm với gói SUNWmdb (hoặc SUNWmdb x cho phiên bản 64 bit).

Tệp lõi là hình ảnh của quá trình chạy của bạn tại thời điểm nó bị lỗi.

Tùy thuộc vào việc ứng dụng của bạn đã được biên soạn với cờ gỡ lỗi hay chưa, bạn sẽ có thể xem hình ảnh của ngăn xếp, do đó, để biết chức năng nào gây ra lõi, để nhận giá trị của các tham số được chuyển đến chức năng, giá trị của các biến, vùng nhớ được phân bổ ...

Trên các phiên bản solaris gần đây, bạn có thể định cấu hình tệp lõi sẽ chứa bằng lệnh coreadm; ví dụ, bạn có thể có các phân đoạn bộ nhớ được ánh xạ mà quá trình được gắn vào.

Tham khảo MDB documentationdbx documentation. Thẻ GDB quick reference cũng hữu ích khi bạn biết những điều cơ bản về GDB.

+2

Trình gỡ lỗi mô đun Solaris là tuyệt vời và khi được sử dụng với libumem là một công cụ rất mạnh. http://blogs.sun.com/pnayak/entry/finding_memory_leaks_within_solaris – Matt

+0

Blog này giúp bạn sử dụng mdb để phân tích coredump trong Solaris: http://cuddletech.com/blog/pivot/entry.php?id=965 –

1

GDB có thể được sử dụng.

Nó có thể thực hiện cuộc gọi đã được thực hiện trước khi kết xuất.

http://sourceware.org/gdb/

http://en.wikipedia.org/wiki/GDB

Có nguồn là rất tốt và nếu bạn có thể tái tạo các lỗi thậm chí tốt hơn là bạn có thể sử dụng để gỡ lỗi nó.

Đã làm việc tuyệt vời cho tôi trong quá khứ.

1

Lệnh pflags cũng hữu ích để xác định trạng thái mà mỗi chuỗi được đưa vào khi lõi được bán. Bằng cách này bạn thường có thể xác định được vấn đề.

1

Đính kèm với những hình ảnh quá trình sử dụng trình gỡ lỗi dbx:

dbx [executable_file_name] [coredump_file_name]

Điều quan trọng là không có thay đổi đối với thực thi kể từ cốt lõi đã được đổ (tức là nó wasn' t xây dựng lại).

Bạn có thể xem theo dõi ngăn xếp để xem chương trình bị lỗi với lệnh dbx "ở đâu".

Bạn có thể di chuyển lên và xuống ngăn xếp bằng lệnh "lên" và "xuống" hoặc nhảy tới khung ngăn xếp chính xác với "khung [số]", với số được nhìn thấy ở đầu ra của "ở đâu".

Bạn có thể in giá trị của các biến hoặc biểu thức bằng lệnh "print [expr]".

Vui chơi.

3

Nếu kết xuất lõi là từ một chương trình bạn đã viết hoặc xây dựng, sau đó sử dụng trình gỡ lỗi nào bạn thường sử dụng để gỡ lỗi ứng dụng đang chạy. Tất cả họ đều có thể tải các tệp lõi. Nếu bạn không cầu kỳ về các trình gỡ rối, và bạn đang sử dụng Solaris, tôi sẽ giới thiệu dbx. Nó sẽ giúp đỡ để có được phiên bản FCS mới nhất của Sun Studio với các bản vá, hoặc phiên bản Express mới nhất của Sun Studio. Nó cũng rất hữu ích nếu bạn có thể tải tệp lõi vào trình gỡ lỗi trên cùng một hệ thống nơi tệp lõi được tạo. Nếu mã trong các thư viện khác với khi tệp lõi được tạo, thì theo dõi ngăn xếp sẽ không hữu ích khi nó đi qua các thư viện. Các trình gỡ rối cũng sử dụng các thư viện trợ giúp của OS để hiểu cấu trúc dữ liệu của trình liên kết libthread và runtime, vì vậy nếu bạn cần tải tệp lõi trên một máy khác, bạn sẽ muốn đảm bảo các thư viện trợ giúp được cài đặt trên hệ điều hành khớp với cấu trúc dữ liệu hệ thống hệ điều hành. Bạn có thể tìm hiểu mọi thứ bạn không bao giờ muốn biết về các thư viện hệ thống này trong một bài báo trắng được viết cách đây vài năm.

http://developers.sun.com/solaris/articles/DebugLibraries/DebugLibraries_content.html

+0

pstack hoàn thành công việc. –

3

Tôi đoán bất kỳ câu trả lời cho câu hỏi này nên bắt đầu với một công thức đơn giản:

Đối dbx, công thức là:

% dbx a.out core 
(dbx) where 
(dbx) threads 
(dbx) thread [email protected] 
(dbx) where 
1

tôi thấy dbx trên hộp x86 solaris tôi tại

/opt/SUNWspro/bin/dbx 

Chúc mừng!

1

Tôi khuyên bạn nên thử gdb đầu tiên vì nó dễ dàng hơn để tìm hiểu các tác vụ cơ bản so với các trình gỡ rối Solaris bản địa theo ý kiến ​​của tôi.