2013-06-18 26 views
5

Ngay cả khi nó có vẻ kỳ lạ, tôi tin rằng mọi người gặp phải loại vấn đề này khi làm việc trên các ứng dụng lớn với nhiều thành phần tùy chỉnh. Một AV được tạo ra ở đâu đó nhưng ứng dụng đang tiếp tục với việc thực hiện và lỗi được đưa ra một số khi sau này. Tôi không nói về ứng dụng đa luồng. Chỉ cần về ứng dụng chuỗi đơn chung chung.Delphi - công cụ/kỹ thuật để theo dõi vi phạm truy cập được lan truyền

Tôi đang đấu tranh để tìm lỗi được tạo ngẫu nhiên và thậm chí tôi đang sử dụng MadExcept/AQT, gỡ lỗi dcus và điểm ngắt, nhưng tôi không thể tìm thấy chính xác các bước khi nó được nâng lên và từ đó nó được nâng lên . Lỗi được lan truyền, và nó được nâng lên trên một tiêu diệt TWinControl (đôi khi là tiêu chuẩn Delphi TPageControl), lần khác khi mở một tập dữ liệu (được mở và đóng vài lần trước đó với cùng một SQL). Vì vậy, ngăn xếp bị hỏng và tôi không thể sử dụng nó trong trường hợp này.

Tôi biết câu hỏi quá địa phương hóa, nhưng tôi hỏi bạn những lựa chọn thay thế khác tồn tại để theo dõi loại lỗi đó.

+1

Cảm ơn bạn cho -1. Bây giờ, bạn có thể cho tôi biết một công cụ bạn đã sử dụng khi đối phó với một tình huống như vậy không? – RBA

+1

Tôi chỉ có thể đưa ra một lời khuyên, thêm đăng nhập vào ứng dụng của bạn. Ít nhất nó sẽ cung cấp cho bạn một gợi ý những gì người dùng đã làm trước khi AV xảy ra. (neutered the -1) – whosrdaddy

+0

Tôi đã thử với nhật ký, hãy thử/ngoại trừ/cuối cùng nhưng không thành công. Lỗi được truyền và tăng lên ngẫu nhiên. – RBA

Trả lời

7

Tôi bắt đầu với việc sử dụng một số trình quản lý bộ nhớ khác để xem liệu bạn có thể buộc mẫu sử dụng ứng dụng của bạn phá vỡ sớm hơn không.

FastMM có thể chạy với FullDebugMode (hãy nhớ đặt DLL theo với EXE ứng dụng của bạn).Một vài điều quan trọng nó có thể làm: bộ nhớ

  • điền theo hình mẫu (như Arioch 'The gợi ý)
  • kiểm tra cho sửa đổi khối sau khi họ đã được giải phóng
  • rò rỉ bộ nhớ log khi chấm dứt áp dụng
  • callback khi các sự kiện nhất định để bạn có thể đăng nhập các nội dung

Trước đây tôi đã viết 2 bài đăng trên blog về FastMM, tôi biết tôi nên viết thêm về nó và các trình quản lý bộ nhớ khác.

Edit: Nice bài viết về quản lý bộ nhớ khác Memory Manager Investigations bởi SO sử dụng Eric Grange.

Đối với mục đích tài liệu hướng dẫn một số nhà quản lý bộ nhớ khác (hầu hết trong số họ không áp dụng cho trường hợp của bạn, nhưng tôi chưa tìm thấy một bài bao gồm tất cả):

Trong môi trường đa luồng, chúng có thể được tốt đẹp :

Trong một thiết lập EXE/DLL, bạn có thể muốn thử FastShareMem.

Trong ScaleMM repository, André Mussche đã làm test quite a few other memory managers.

NB: +1; câu hỏi hay, và tôi nên tìm một thời gian để viết một theo dõi bài viết trên blog về quản lý bộ nhớ Delphi (:

+0

+1 Cảm ơn câu trả lời – RBA

2

Tôi tin rằng đây là câu hỏi chung hơn câu hỏi Delphi. Nhưng một số kỹ thuật hữu ích bao gồm:

  • khai thác gỗ quá mức vào một tập tin, do đó bạn có thể nghiên cứu nó sau này - với tất cả các giá trị
  • Khẳng định ở khắp mọi nơi. Bạn có thể vô hiệu hóa chúng để chúng không mất chi phí khi phát hành
  • Tắt các phần của ứng dụng cho đến khi lỗi dừng xuất hiện hoặc
  • Tắt mọi thứ ngoại trừ vỏ cơ bản và sau đó bật từng thành phần cho đến khi AV quay lại.
  • Rò rỉ bộ nhớ theo dõi với ReportMemoryLeaksOnShutdown := true.

Khi bạn tìm thấy một thành phần có vẻ như gây ra lỗi, hãy truy cập vào nó và lặp lại quy trình vô hiệu hóa mọi thứ bên trong và bật từng phần.

3

Ghi nhật ký vào tệp có thể thay đổi kết quả, vì vậy tôi khuyên bạn nên dùng trình gỡ lỗi GExperts để ghi thư vào cửa sổ đầu ra trong thời gian thực. Viết hàm bao bọc để bạn có thể đổ vào một tệp nếu muốn, kiểm soát nội dung được ghi lại (bộ lọc loglevel), v.v.

Đặt nhật ký khởi tạo/hoàn tất tất cả các đơn vị. Tôi đã phát hiện ra rằng lỗi "ngoài màu xanh" thường xảy ra trong quá trình hoàn thành. ví dụ: bạn đóng một kết nối cơ sở dữ liệu, nhưng đối tượng đó đã được giải phóng bởi một thứ khác. D'oh!

Cũng đặt nhật ký trong trình xử lý sự kiện của bất kỳ thành phần nào, cũng như trình phá hủy của các thành phần đó. Điều này sẽ cho bạn thấy nếu bạn đang nhận được sự kiện bắn sau khi các thành phần đã bị phá hủy.

Như một phương sách cuối cùng, bạn có thể phải "ngắt" chương trình, xóa tất cả mã mà bạn đã viết, trong "khối". Lưu mã ở đâu đó, xóa trình xử lý sự kiện trên form1, biên dịch và thử nghiệm. Nếu lỗi này biến mất, hãy đặt lại các trình xử lý sự kiện và xóa một nửa số đó, kiểm tra lại. Tiếp tục cho đến khi bạn thu hẹp nó xuống đầy đủ, và thủ phạm nên được xác định bởi quá trình loại bỏ.

2

Hai điều đã trở thành người bạn tốt nhất của tôi, đặc biệt là, khi phát triển công cụ trực quan không và không chỉ trong Delphi:

  • Unit tests và khai thác gỗ

tôi sử dụng (Dunit) cho unit tests mà còn để thực hiện hệ thống và căng thẳng thử nghiệm. tôi sử dụng AQT để đánh giá phạm vi của bài kiểm tra đơn vị của tôi và bộ nhớ bị rò rỉ phát hiện. ý tưởng là tôi không cần phải viết trước các bài kiểm tra cho mọi phương pháp duy nhất, nhưng cố gắng viết một bài kiểm tra bao gồm càng nhiều càng tốt. Khi có một vấn đề cụ thể, sau đó tôi viết một bài kiểm tra để tái tạo sự cố sau đó tôi biết khi nào công việc khắc phục của tôi hoạt động. Một lợi thế đặc biệt, với các ứng dụng lớn, là tôi có thể chạy thử nghiệm sau khi thực hiện các thay đổi và xác minh rằng mọi thứ vẫn hoạt động như mong đợi.

Công cụ khác mà tôi sử dụng là SmartInspect, vì nó ghi nhật ký và nhập các phương thức, trong số những thứ khác và có Trình hướng dẫn cụ thể mã hiện có (thêm đăng nhập để thoát) và bảng điều khiển để lọc nhật ký.

2

Thật kỳ lạ, không ai đề cập đến trình quản lý bộ nhớ gỡ lỗi được gọi là SafeMM. Nó có thể bắt AV chính xác nơi nó xảy ra.

+0

+1 Tôi sẽ thử nó để xem nó hoạt động như thế nào. – RBA

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