2008-09-30 33 views
6

chúng tôi gặp sự cố với một ứng dụng mà chúng tôi đang phát triển. Rất hiếm khi, như một lần trong một trăm, ứng dụng bị treo khi khởi động. Khi sự cố xảy ra, nó sẽ làm giảm toàn bộ hệ thống, máy tính bắt đầu kêu bíp và đóng băng hoàn toàn, cách duy nhất để khôi phục là tắt nguồn (chúng tôi đang sử dụng Windows XP). Sự hiếm có của vụ tai nạn kết hợp với thực tế là chúng tôi không thể đột nhập vào trình gỡ lỗi hoặc thậm chí tạo ra một stackdump khi nó xảy ra làm cho nó cực kỳ khó khăn để gỡ lỗi.Ghi nhật ký/giám sát tất cả các cuộc gọi chức năng từ một ứng dụng

Tôi đang tìm thứ gì đó ghi nhật ký tất cả các cuộc gọi hàm vào một tệp. Công cụ như vậy có tồn tại không? Nó không phải là không thể thực hiện, profilers như VTune làm một cái gì đó rất giống nhau.

Chúng tôi đang sử dụng studio hình ảnh 2008 (C++).

Cảm ơn

A.B.

Trả lời

0

GCC (bao gồm phiên bản MingGW for Windows development) có công tắc mã được gọi là -finstrument-functions để trình biên dịch phát ra các cuộc gọi đặc biệt đến các hàm gọi là __cyg_profile_func_enter và __cyg_profile_func_exit xung quanh mọi cuộc gọi hàm. Đối với Visual C++, có các tùy chọn tương tự được gọi là /GH/Gh. Điều này làm cho trình biên dịch phát ra các cuộc gọi đến __penter và __pexit xung quanh các cuộc gọi hàm.

Các chế độ thiết bị này có thể được sử dụng để triển khai hệ thống ghi nhật ký, khi bạn thực hiện các cuộc gọi mà trình biên dịch tạo ra để xuất ra hệ thống tệp cục bộ hoặc máy tính khác trên mạng của bạn.

Nếu có thể, tôi cũng thử chạy hệ thống của bạn bằng cách sử dụng valgrind hoặc công cụ kiểm tra tương tự. Điều này có thể bắt gặp vấn đề của bạn trước khi nó bị mất.

2

Vấn đề duy nhất với ý tưởng khai thác gỗ là khi hệ thống bị treo, các mục đăng nhập mới nhất vẫn có thể là trong bộ nhớ cache và không có cơ hội để được ghi vào đĩa ...

Nếu là tôi tôi sẽ thử chạy chương trình trên một máy tính khác - nó có thể là phần cứng hoặc trình điều khiển không ổn định gây ra sự cố. Một chương trình ứng dụng "không nên" có thể làm giảm hệ thống.

2

Một vài ý tưởng-
Có khả năng tốt là ngay trước khi xảy ra sự cố, có một số loại ngoại lệ trong ứng dụng. nếu bạn đặt trình xử lý cho tất cả các ngoại lệ chưa được xử lý bằng cách sử dụng SetUnhandledExceptionFilter() và viết một dấu vết ngăn xếp vào tệp nhật ký của bạn, bạn có thể có cơ hội để bắt gặp sự cố.
Chỉ cần nhớ xả tệp sau mỗi lần viết.

Tùy chọn khác là sử dụng công cụ như strace ghi nhật ký tất cả các cuộc gọi hệ thống vào hạt nhân (có nhiều hương vị và cách triển khai để chọn yêu thích của bạn). nếu bạn nhìn vào nhật ký ngay trước khi xảy ra sự cố, bạn có thể tìm thấy thủ phạm

+0

Cảm ơn bạn đã liên kết liền mạch. – Constantin

3

Nhập/thoát chức năng ghi nhật ký là cách tiếp cận cấp thấp cho vấn đề của bạn. Tôi sẽ đề nghị sử dụng công cụ gỡ lỗi tự động (sử dụng khóa Debugger trong Tùy chọn thực thi tệp hình ảnh với regedit hoặc sử dụng gflags từ gói mà tôi cung cấp liên kết đến bên dưới) và cố gắng repro vấn đề cho đến khi nó gặp sự cố.Ngoài ra, bạn có thể có lịch trình cuộc gọi của trình gỡ lỗi cuộc gọi của (các) mô-đun nghi ngờ bằng cách sử dụng tập lệnh hoặc đã thu thập bất kỳ thông tin nào khác.
Nhưng không biết chi tiết đơn đăng ký của bạn, rất khó để đề xuất giải pháp. Có một ứng dụng, dịch vụ hoặc trình điều khiển của người dùng không? "Crash at startup" nghĩa là gì - lúc khởi động windows hoặc khởi động ứng dụng?
Sử dụng debugger package để khắc phục sự cố này.

2

Bạn đã cân nhắc sử dụng máy thứ hai làm trình gỡ lỗi từ xa (qua mạng) chưa? Khi ứng dụng (và hệ thống) gặp sự cố, máy thứ hai sẽ vẫn hiển thị một số thông tin hữu ích, nếu không phải là điểm thực sự của vấn đề. Tôi tin rằng VC++ có khả năng đó, ít nhất là trong một số phiên bản.

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