Làm thế nào mà họ gỡ lỗi lỗi phân đoạn trước khi bộ nhớ được bảo vệ?


20

Bây giờ, khi tôi mắc lỗi lập trình với con trỏ trong C, tôi gặp lỗi phân đoạn đẹp, chương trình của tôi gặp sự cố và trình gỡ lỗi thậm chí có thể cho tôi biết nó đã sai ở đâu.

Làm thế nào mà họ làm điều đó trong thời gian khi bảo vệ bộ nhớ không có sẵn? Tôi có thể thấy một lập trình viên DOS đang loay hoay và đánh sập toàn bộ HĐH khi anh ta mắc lỗi. Ảo hóa không có sẵn, vì vậy tất cả những gì anh có thể làm là khởi động lại và thử lại. Nó đã thực sự đi như vậy?


4
Đúng, đó là cách nó đã đi. Một khởi động lại máy tính ngẫu nhiên đã xảy ra, và xảy ra thường xuyên. Bảo vệ bộ nhớ là một điều tuyệt vời :)
Rocklan

7
Khi bạn không có bộ nhớ được bảo vệ, sẽ không có lỗi phân đoạn. Tất nhiên, ngay cả khi bạn có bộ nhớ được bảo vệ, bạn vẫn có thể ghi đè lên không gian của riêng bạn; HĐH không quan tâm đến nó.
Blrfl

3
Ngay cả bây giờ nhiều lỗi con trỏ không gây ra một segfault đẹp.
CodeInChaos

1
Tại thời điểm DOS, bộ nhớ được bảo vệ đã tồn tại trong các HĐH khác.
mouviciel

Câu trả lời:


36

Tôi có thể thấy một lập trình viên DOS đang loay hoay và đánh sập toàn bộ HĐH khi anh ta mắc lỗi.

Vâng, đó là khá nhiều những gì đã xảy ra. Trên hầu hết các hệ thống có bản đồ bộ nhớ, vị trí 0 được đánh dấu không hợp lệ, do đó có thể dễ dàng phát hiện ra các con trỏ null, vì đó là trường hợp phổ biến nhất. Nhưng có rất nhiều trường hợp khác, và chúng gây ra sự tàn phá.

Có nguy cơ nghe giống như một geezer, tôi nên chỉ ra rằng sự tập trung hiện tại vào việc gỡ lỗi không phải là cách của quá khứ. Nhiều nỗ lực hơn trước đây đã được thực hiện để viết các chương trình chính xác, thay vì loại bỏ các lỗi từ các chương trình không chính xác. Một số trong đó là vì đó là mục tiêu của chúng tôi, nhưng rất nhiều là vì các công cụ làm cho mọi thứ trở nên khó khăn. Hãy thử viết chương trình của bạn trên giấy hoặc trên thẻ đục lỗ, không phải trong IDE và không có lợi ích của trình gỡ lỗi tương tác. Nó cung cấp cho bạn một hương vị cho sự chính xác.


3
Trong thực tế, tôi đã hy vọng "geezers old" sẽ trả lời câu hỏi của tôi. Không có gì đánh bại kinh nghiệm đầu tay. Cảm ơn.
Bart Friederichs

6
Hãy thử viết mã khi phần cứng có sẵn để gỡ lỗi mỗi đêm từ 02:00 đến 06:00, tất nhiên giả sử rằng đồng nghiệp của bạn đã không dành riêng cho phiên gỡ lỗi của mình.
MSalters

@MSalters Thật vậy! Ở công việc đầu tiên của tôi, chúng tôi cũng có thể đặt chỗ vào Chủ nhật từ 0700 đến 1900 - một điều trị thực sự, tôi nói với bạn :-)
Ross Patterson

2
Tôi nhớ đã viết chương trình đầu tiên của tôi trên giấy đi từ trường đại học. Ngày hôm sau khi tôi có thể đấm nó và chạy nó, thật hoàn hảo ;-)
Jan Doggen

1
@JanDoggen, tôi cũng vậy. Khi bạn chỉ có một lần thử, bạn thực hiện thử đó.
nalply

23

Ngày trước, chúng tôi không có bảo vệ bộ nhớ và tất cả những công việc kinh doanh hấp dẫn đó! Chúng tôi đã sử dụng printf để xác định vị trí của chúng tôi trong chương trình và chúng tôi thích nó !

Mặc dù trong tất cả sự nghiêm túc, điều đó thường có nghĩa là chúng tôi chỉ cẩn thận hơn. Trường hợp malloc được gọi, phải có một nơi nào đó miễn phí trong chương trình và việc kiểm tra như vậy rất nghiêm ngặt vì trong trường hợp có vấn đề, như bạn đã chỉ ra rõ ràng, lỗi phân đoạn không phải là lỗi hữu ích.

Trong trường hợp xảy ra lỗi như vậy, điều tốt nhất bạn có thể làm là cố gắng hiểu khi xảy ra lỗi phân đoạn như vậy (sử dụng printf) và, xem mã, xác định tại sao quyền truy cập vào bộ nhớ tại thời điểm đó không hợp lệ và hoạt động ngược từ đó.

Về bản chất, điều tương tự xảy ra ngày hôm nay, ngoại trừ chúng tôi sử dụng trình gỡ lỗi để xác định khi nào xảy ra lỗi, nhưng bạn vẫn phải hiểu lý do tại sao nó xảy ra và không phải lúc nào cũng đơn giản như tìm ra dòng xảy ra lỗi. Lỗi gây ra lỗi như phản ứng dây chuyền và nếu bạn là lập trình viên C trong những ngày đó, bạn đã dành 20% thời gian để viết mã và phần còn lại của thời gian để kéo tóc ra để sửa lỗi.


2
Miễn phí Mallocs!
Chris

1
Thỉnh thoảng, ngay cả ngày nay, ngay cả ngăn xếp cuộc gọi và trạng thái biến cũng hoàn toàn vô dụng để xác định xem cái quái gì đã sai và cách khắc phục nó. Đó là trường hợp đặc biệt nếu bạn có phần mềm phức tạp với một số lượng lớn các trạng thái có thể xảy ra, một số trong đó phụ thuộc lẫn nhau và một số loại trừ lẫn nhau. Một lần đi lạc viết bất cứ nơi nào và một xác nhận bị bỏ qua cho điều kiện tiên quyết được đảm bảo có thể mang lại cho bạn ngay tại đó.
một CVn

1
@ MichaelKjörling, tôi nghĩ rằng đối với những gì mối quan tâm khám phá những sai sót trong chương trình, chúng tôi đã tiến triển chỉ cho những gì mối quan tâm tìm cò lỗi, nhưng chúng tôi vẫn có dặm để đi cho phát hiện ra nguyên nhân cho các lỗi này. Các xác nhận giúp giữ cho tôi lành mạnh, chắc chắn. :)
Neil

6

tốt ..

segfault là một chỉ báo thực sự tốt cho thấy có gì đó không ổn nhưng bạn vẫn phải tìm ra nguyên nhân gốc rễ. Vì vậy, nếu bạn đặt câu hỏi làm thế nào để bạn tìm ra nguyên nhân gốc rễ hơn câu trả lời ngày nay không khác nhiều so với trước đây. Tất nhiên các ngôn ngữ và công cụ trở nên dễ dàng hơn để làm việc với nhưng taktik chung là như nhau:

  • đăng nhập giúp tìm ra khu vực mà vấn đề của bạn là. Printf nhị phân là một hình thức của nó.
  • gỡ lỗi, từng bước, phá vỡ điểm và đồng hồ
  • tái cấu trúc để hiểu rõ hơn
  • nhìn chằm chằm vào mã
  • nhìn vào bãi chứa bộ nhớ / lõi
  • cho nó ăn với dữ liệu khác nhau
  • cho người khác xem
  • chuyển sang ngôn ngữ không có con trỏ (và một loạt vấn đề mới) ...

Ở mức độ trừu tượng hơn, bạn có ba cách tiếp cận: 1. làm việc với mã 2. nhìn vào chương trình trong khi nó chạy 3. xem kết quả sau khi nó làm điều gì đó ngu ngốc

btw một lỗi con trỏ không phải tạo một segfault.

Là một lập trình viên Amiga, tôi đã sử dụng khá nhiều tất cả. Và có khởi động lại nơi thực hành phổ biến.


4

Trên IBM 360, chạy các công việc hàng loạt của Fortran, chúng tôi đã sử dụng để có các kết xuất lõi hex. Một bãi rác như vậy có thể dày bằng một inch giấy in màu xanh lá cây và quạt gấp. Nó sẽ cho biết các thanh ghi là gì, và từ đó chúng ta có thể quay lại và tìm ra chương trình đang làm gì. Chúng ta có thể tìm thấy từng chương trình con và tìm ra nơi nó lưu địa chỉ trả về của nó, vì vậy chúng ta có thể thấy bối cảnh. Nó sẽ giúp có một danh sách trình biên dịch chương trình.


2

Khi tôi đang sửa lỗi trên phần mềm Trình bày Windows 3.1 nổi tiếng.

Tôi đã gặp một lỗi mà khi nó xảy ra đã gây ra Màn hình xanh chết chóc.

Lỗi chỉ xảy ra khi một vòng lặp nhất định đã được thực hiện hơn 1000 lần. Tôi đã sử dụng các tính năng nâng cao của trình gỡ lỗi để cho điểm dừng vượt qua 1000 lần và sau đó tôi cẩn thận bước qua chương trình. Mỗi lần tôi đi quá xa hoặc bỏ qua một cuộc gọi chức năng có lỗi Windows Blue Screened.

Cuối cùng, sau vài ngày làm việc, tôi đã thu hẹp nó xuống một chức năng sắp hết bộ nhớ và thay vì hiển thị thông báo lỗi, nối thêm thông báo lỗi vào bộ đệm. Với mỗi lần lặp lại tiếp theo, nó sẽ bỏ thêm bộ nhớ cho đến khi một cái gì đó quan trọng bị ghi đè và Windows bị vứt đi.

Kỹ năng sửa lỗi và sự kiên trì là giải pháp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.