2008-10-21 20 views
5

Tôi có hai câu hỏi:Debugging ngược

  1. Trong khi làm cấp nguồn gỡ lỗi (sử dụng bất kỳ debugger) hiện bất kỳ debugger tiết kiệm nhà nước của một số lặp/cho vòng/bất kỳ mã thực thi và cho phép người dùng quay trở lại trạng thái mã/dữ liệu được thực hiện trước đó tại một thời điểm sau đó trong khi gỡ lỗi? Sự cần thiết cho điều này là một số biến/con trỏ bị hỏng ở đâu đó trước đó trong thời gian thực hiện nhưng được truy cập sau một thời gian/sau đó trong việc thực thi mã và thats khi nó treo/treo mã, vì vậy tôi muốn quay trở lại và xem mà chức năng/vào thời điểm nào biến bị hỏng/sai giá trị tính toán và ghi vào nó? Có thể trong bất kỳ trình gỡ rối nào (gcc, MSVC6.0 ...)

  2. Có bất kỳ trình gỡ rối/IDE nào có điều kiện khi địa chỉ/biến bộ nhớ được đánh dấu là "phân tích" hay không và mã nào thay đổi bộ nhớ đó (ghi), mỗi khi nó được thay đổi/ghi?

-AD

+4

Nếu gỡ lỗi là quá trình xóa lỗi [hoặc ít nhất là xác định chúng], thì gỡ lỗi ngược lại phải là quá trình đưa chúng vào ... hoặc nói cách khác là lập trình! – Mikeage

Trả lời

0

Tôi tin rằng phiên bản mới nhất của OCaml có này. Điều này có vẻ như một mốt khá mới, nhưng IIRC này là trên danh sách mong muốn của phiên bản tương lai của Visual Studio.

Tính năng trong VS tôi chưa sử dụng, có thể theo dõi các đối tượng (tạo id đối tượng hoặc thứ gì đó).

2

Tôi không biết bất kỳ trình gỡ lỗi nào cho phép bạn lưu trạng thái để quay lại sau. Trình gỡ rối sẽ không có cách nào biết được trạng thái nào là phù hợp. Gần nhất bạn có thể nhận được là tạo một tệp kết xuất tại một thời điểm nào đó, điều này sẽ cho phép bạn kiểm tra toàn bộ trạng thái chương trình sau đó.

Visual Studio hỗ trợ data breakpoints sẽ đột nhập vào trình gỡ lỗi bất cứ khi nào vị trí bộ nhớ nhất định được ghi.

Đây có thể rất hữu ích để tìm ra những gì đang giẫm lên một mảnh bộ nhớ đang bị hỏng. Tuy nhiên, có những giới hạn về số lượng điểm ngắt dữ liệu mà bạn có thể thiết lập, vì chúng được thực hiện bằng cách sử dụng hỗ trợ đăng ký phần cứng từ bộ xử lý.

3

Đối với # 2, bạn có thể muốn đọc khoảng watchpoints, có sẵn trong gdb, trong số các trình gỡ rối khác.

Điểm quan sát tương tự như điểm ngắt. Tuy nhiên, các điểm quan sát là không được đặt cho các chức năng hoặc dòng mã . Điểm quan sát được đặt trên các biến số . Khi các biến đó là đọc hoặc viết, điểm quan sát là được kích hoạt và dừng thực thi chương trình.

1

Đối với điểm đầu tiên, bạn có thể thử các điểm ngắt có điều kiện. Hầu hết các debuggers tôi đã sử dụng dường như có tính năng này, mặc dù rất nhiều người không biết về nó. Bạn có thể đặt điểm dừng để chỉ dừng lại khi một số điều kiện được thỏa mãn, như biến lặp của bạn là một số hoặc một số biến khác là null. Ví dụ:

for (i = 0; i < list.size(); i++) { 
    foo = list[i]; 
} 

Bạn có thể thiết lập một breakpoint có điều kiện để dừng lại khi i == 17, hoặc khi foo == null.

1

Đối với vấn đề đầu tiên: ddd/gdb có một số backtrace cho bạn thấy chính xác cách thức đến điểm đó. Ngoài ra một coredump có thể giúp đỡ.

Một bài viết thú vị về một khả năng tác dụng phụ là this one

10

Nghe có vẻ một awful nhiều như bạn sẽ muốn lấy một bản sao của Visual Studio 2010.

Họ đang thực hiện gần như chính xác những gì bạn đang mô tả trong # 1 - có một screencast về mới "The Debugger lịch sử" trong Visual Studio Team System 2010 trên Channel 9.

Có thêm một chút về nó trong cụm từ này nằm here (this one is for the April 2008 CTP of codename 'Rosario')

tôi đã tìm thấy định nghĩa này của Debugger lịch sử mới từ một entry blog của Maor David (here):

"Visual Studio Lịch sử Debugger Khi một lỗi xảy ra, bạn có thể nhanh chóng tìm ra nguyên nhân gốc rễ bằng cách điều tra thông tin được ghi bởi Trình gỡ lỗi lịch sử. Tại bất kỳ thời điểm nào trong quá trình gỡ lỗi, bạn có thể quay trở lại và chuyển tiếp trong thời gian để xác định nơi xảy ra lỗi. "

Đây cũng là một số khác video walkthrough!

Chỉnh sửa: Tôi bắt đầu đánh giá mức giảm tối thiểu (1) recent CTP (31/10 - ngày 08 tháng 10) của Visual Studio 2010 và dường như họ có phiên bản đầu tiên của trình gỡ lỗi lịch sử được triển khai. Nó có thể là giá trị kiểm tra ra.

(1) [http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&displaylang=en]

4

Tôi nghĩ rằng bạn đang cố gắng để có được một Omniscient Debugger hoặc Tangible Program Histories (từ năm 1999 !!).

Tất nhiên đây là các bài viết/triển khai nghiên cứu nhiều hơn nhưng dường như các khái niệm này cuối cùng cũng được đưa vào các trình biên dịch chính thống.

2

Bạn có thể muốn xem Replay Debugging từ VMware.

Từ liên kết:

Những gì chúng ta đã được tích hợp Visual Studio plugin cho Workstation với công nghệ ghi/Replay. Bây giờ bạn có thể phát triển ứng dụng của bạn với Visual Studio, và sau đó với một vài cú click chuột khởi động nó trong một máy ảo trong chế độ ghi. Sau đó bạn có thể phát lại bản ghi nhiều lần tùy thích, sử dụng tất cả các cơ sở gỡ lỗi mà Visual Studio cung cấp.

Nhưng chúng tôi không dừng lại ở đó. Chúng tôi cũng triển khai tính năng "thực hiện đảo ngược" độc đáo " ". Này, nếu bạn đang gỡ một tham nhũng bộ nhớ , bạn có thể đặt watchpoint vào bộ nhớ hỏng và sau đó nhấn "Reverse Tiếp tục" trong Visual Studio đơn Plugin - và chúng tôi sẽ hướng ghi ngay đến nơi nơi bộ nhớ là được viết lần cuối .

0

Trong khi trình gỡ rối hiện tại không lưu trạng thái, chúng cho phép bạn quay lại, ở một mức độ nào đó. Bạn có thể sử dụng tính năng "di chuyển điểm đến đây" (tên thực tế sẽ phụ thuộc vào trình gỡ rối của bạn), tất nhiên) để thiết lập dòng đang được thực hiện. Điều này chỉ thực sự hoạt động tốt khi nhảy xung quanh trong một hàm duy nhất, nhưng nó có thể hữu ích cho "thử lại" với một giá trị khác - bạn ngắt sau một vòng lặp, sử dụng trình gỡ lỗi để thay đổi các giá trị biến, và sau đó nhảy quay lại đầu vòng lặp. Ngoài ra, nếu bạn biết rằng một cuộc gọi chức năng sẽ thất bại nhưng bạn muốn xem điều gì xảy ra sau đó (ví dụ ... một cái gì đó đã hết thời gian vì bạn đã bị dừng trong trình gỡ rối, nhưng bạn muốn tiếp tục thực hiện như thể nó không có ' t đã hết thời gian chờ), bạn có thể sử dụng tính năng "di chuyển điểm đến đây" để bỏ qua mã đó.

Tôi biết đó không phải là những gì bạn yêu cầu, nhưng hiện tại, đó là tất cả những gì chúng tôi có ... Tôi tin rằng công nghệ này có thể sẽ sớm có sẵn, nhưng hiện tại tôi nghĩ nó đang trong giai đoạn nghiên cứu .

1

Kể từ tháng 9 năm 2009, trình gỡ lỗi GNU (gdb) có khả năng đảo ngược gỡ lỗi, nghĩa là khả năng thực hiện chương trình đang được gỡ lỗi và tiếp tục ngược lại. Điều này nghe giống như những gì bạn đã yêu cầu.

Xem tại đây để biết chi tiết: http://sourceware.org/gdb/news/reversible.html.