1. Trang chủ
  2. » Công Nghệ Thông Tin

Trình bày lỗi (lỗi xử lý)

19 145 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Cấu trúc

  • Trình bày lỗi (Lỗi xử lý)

  • Codes

  • Giải quyết Các ngoại lệ có cấu trúc

  • Mã số mẫu

  • Khối Try – Except.

  • Đưa ra ngoại lệ

  • Ví dụ thực tế

  • Ví dụ

Nội dung

Trình bày lỗi (Lỗi xử lý) Trình bày lỗi (Lỗi xử lý) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Lỗi luôn phát sinh chương trình Một số người số họ bắt đầu với chương trình lỗi, mã riêng thành viên trong-chế độ gọi ứng dụng mà mã Một số người số họ liên quan đến hệ thống nạp làm tiểu bang phần cứng Bất nguyên nhân, hoàn cảnh không bình thường nhu cầu linh hoạt phản hồi từ mã Trong phần này, mô tả ba khía cạnh xử lý lỗi: tình trạng mã số, ngoại trừ cấu trúc xử lý, kiểm tra lỗi Nhìn chung, chế độ hỗ trợ hạt nhân-thói quen báo cáo lỗi không mong muốn cách trả mã trạng thái, họ báo cáo dự kiến biến thể bình thường dòng chảy cách trả giá trị số Boolean khác trạng thái thức mã Cấu trúc xử lý ngoại lệ cung cấp tiêu chuẩn để dọn sau thực không mong muốn kiện, chẳng hạn dereferencing người dùng không hợp lệchế độ trỏ, để tránh đụng xe mà hệ thống thông thường ensues sau kiện Một lỗi kiểm tra nội tên gọi cho thất bại thảm cho hệ thống tắt chữa khỏi Codes Kernel_mode hỗ trợ thói quen (và mã bạn ,cho vấn đề) cho biết thành công hay thất bại cách trả mã trạng thái họ để gọi NTSTATUS giá trị 32-bit integer gồm số subfields, minh họa hình 3-2 Cao-bit trật tự biểu mức độ nghiêm trọng điều kiện báo cáo-thành công, thông tin, cảnh báo, lỗi Tôi giải thích tác động khách hàng sớm cờ Các thiết bị mã cho biết thành phần hệ thống nguồn gốc tin nhắn decouple để phục vụ phát triển nhóm từ nói đến số điện thoại để gán mã Trong phần lại tình trạng mã 16-bit 'giá trị-cho biết xác điều kiện báo cáo 1/19 Trình bày lỗi (Lỗi xử lý) Bạn nên luôn kiểm tra tình trạng tra từ thủ tục mà họ cung cấp Tôi dừng kết nguyên tắc thường xuyên số đoạn mã cho bạn bao gồm tất lỗi cần thiết xử lý mã thường xuyên che lấp expository đích đoạn Nhưng bạn không mô thực hành động Nếu bit-cao, trật tự mã trạng thái 0, số bit lại thiết lập mã cho biết thành công Do đó, không cần so sánh với tình trạng mã số để xem liệu bạn đối phó với thành công-thay vì, sử dụng macro NT_SUCCESS: NTSTATUS status = SomeFunction( ); if (!NT_SUCCESS(status)) { //handle error } Không làm bạn muốn kiểm tra tình trạng mã số mà bạn nhận từ thói quen bạn gọi , bạn muốn trả trạng thái mã số thủ tục bạn gọi Trong chương trước, xử lý với hai trình điều khiển subroutines-DriverEntry AddDevice-được định nghĩa hai lại NTSTATUS mã Như thảo luận, bạn muốn trả STATUS_SUCCESS thành công từ thói quen Nếu có sai, bạn thường muốn trả mã trạng thái thích hợp, mà 2/19 Trình bày lỗi (Lỗi xử lý) giá trị trả cho bạn Ví dụ, số bước hàm AddDevice , với tất lỗi kiểm tra bên trái: NTSTATUS AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo) { NTSTATUS status; PDEVICE_OBJECT fdo; status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &fdo); if (!NT_SUCCESS(status)) { KdPrint(("IoCreateDevice failed - %X\n", status)); return status; } PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; pdx->DeviceObject = fdo; pdx->Pdo = pdo; pdx->state = STOPPED; IoInitializeRemoveLock(&pdx->RemoveLock, 0, 0, 0); status = IoRegisterDeviceInterface(pdo, &GUID_SIMPLE, NULL, &pdx->ifname); if (!NT_SUCCESS(status)) { 3/19 Trình bày lỗi (Lỗi xử lý) KdPrint(("IoRegisterDeviceInterface failed - %X\n", status)); IoDeleteDevice(fdo); return status; } } IoCreateDevice trở lại mã trạng thái cho Lưu ý việc sử dụng macro NT_SUCCESS mô tả văn Nó ý tưởng tốt, đặc biệt khả gỡ lỗi trình điều khiển , để in tình trạng lỗi bạn khám phá Tôi thảo luận cách sử dụng xác KdPrint sau chương (trong phần "Mẫu Debugging Easier" ) IoInitializeRemoveLock, thảo luận Chương 6, không thành công Do đó, không cần phải kiểm tra mã trạng thái Nói chung, hầu hết hàm tuyên bố với loại VOID có loại "không thể không" Một số hàm VOID có văn bị thất bại nuôi ngoại lệ, tài liệu DDK hành vi rõ ràng IoRegisterDeviceInterface nên không thành công, có số ngẫu nhiên để làm trước quay trả lại gọi ; cụ thể,chúng phải gọi IoDeleteDevice để tiêu diệt thiết bị đối tượng, cần tạo Bảng 3-1 cho thấy thư quan trọng tình trạng mã số 4/19 Trình bày lỗi (Lỗi xử lý) Sự khác biệt lỗi cảnh báo đáng kể Ví dụ, không METHOD_BUFFERED kiểm soát hoạt động (xem Chương 9) với STATUS_BUFFER_OVERFLOW-a-gây cảnh báo I / O Trưởng đại diện để chép liệu người sử dụng chế độ-buffer Việc không hoạt động với STATUS_BUF ¬ FER_TOO_SMALL-một lỗi-nguyên nhân I / O Trưởng đại diện cho không chép liệu Giải Các ngoại lệ có cấu trúc Gia đình hệ điều hành Windows cung cấp phương pháp xử lý điều kiện đặc biệt giúp bạn tránh tiềm hệ thống treo Tích hợp chặt chẽ với biên mã Máy phát điện, cấu trúc xử lý ngoại lệ cho phép bạn dễ dàng đặt bảo vệ phần mã bạn xử lý gọi ngoại trừ có sai phần guarded Cấu trúc ngoại lệ xử lý cho phép bạn dễ dàng cung cấp tài liệu kiếm mà bạn chắn luôn thực vấn đề kiểm soát guarded phần mã Rất buổi hội thảo học sinh quen thuộc với cấu trúc ngoại lệ, giải thích số Những vấn đề Mà bạn viết tốt hơn, thêm bulletproof mã bạn sử dụng tiện nghi Trong nhiều tình huống, tham số mà bạn nhận trình điều khiển WDM quán triệt vetted mã không cau Tốt hương vị có thể, đó, đà để bạn sử dụng công cụ Tôi mô tả phần Như quy luật chung, nhiên, bạn luôn muốn bảo vệ tài liệu tham khảo trực tiếp với người sử dụng nhớ ảo-chế độ với cấu trúc khung ngoại lệ Những tài liệu tham khảo xảy bạn trực tiếp tham chiếu nhớ bạn gọi MmProbeAndLockPages, ProbeForRead, ProbeForWrite, có lẽ thời gian khác Mã số mẫu Các SEHTEST mẫu minh hoạ driver khí cấu trúc ngoại lệ trình điều khiển WDM Ngoại lệ trở thành trapped Gary Nebbett nghiên cứu câu hỏi có trường hợp ngoại lệ trapped với cấu trúc ngoại trừ chế báo cáo kết newsgroup đăng nhiều năm trước SEHTEST mẫu hợp ông học Nói tóm lại, trường hợp ngoại lệ sau họ bị bắt lại xảy IRQL nhỏ DISPATCH_LEVEL (lưu ý số số cụ thể cho xử lý Intel x86): • Bất kỳ ký ExRaiseStatus liên quan hàm để lại dự 5/19 Trình bày lỗi (Lỗi xử lý) • dereference không hợp lệ cho người dùng trỏ-chế độ nhớ • Debug Breakpoint ngoại lệ • Integer overflow (hướng dẫn nhập) • opcode không hợp lệ Lưu ý tham chiếu đến chế độ không hợp lệ hạt nhân-trỏ dẫn trực tiếp đến lỗi kiểm tra không trapped Tương tự, chia-do-hay không ngoại trừ ngoại lệ RÀNG BUỘC hướng dẫn dẫn tới lỗi kiểm tra Chương trình hạt nhân-chế độ sử dụng cấu trúc ngoại trừ trường hợp ngoại lệ cách xây dựng khung rơm sử dụng cho đối số qua, subroutine gọi điện thoại, tự động biến Một dành để xử lý đăng ký điểm ngoại trừ khung Mỗi phòng khung điểm đến trước khung Bất ngoại lệ xảy ra, hạt nhân tìm kiếm danh sách ngoại lệ cho ngoại trừ khung handler Nó luôn tìm thấy có ngoại lệ khung stack mà xử lý khác unhandled ngoại lệ Một hạt nhân nằm ngoại lệ handler, unwinds việc thực ngoại trừ khung stacks song song, kêu gọi xử lý dọc theo đường Sau đó, điều khiển cho ngoại lệ handler Khi bạn sử dụng biên Microsoft, bạn sử dụng Microsoft mở rộng cho C / C + + ngôn ngữ mà ẩn số phức tạp nguyên liệu làm việc với hệ điều hành primitives Bạn sử dụng try tuyên bố để phức hợp tuyên bố guarded thể cho ngoại trừ khung, bạn sử dụng finally tuyên bố thành lập handler chấm dứt except tuyên bố thành lập ngoại lệ handler Đầu tiên máy tính thi guarded thể Khi kiểm soát guarded thể cho lý gì, máy tính handler thi chấm dứt Xem Hình 3-3 6/19 Trình bày lỗi (Lỗi xử lý) Hình 3-3 Kiểm soát dòng chảy thử-cuối khối Đây đơn giản Illustration: LONG counter = 0; try { ++counter; } finally { counter; } KdPrint(("%d\n", counter)); Guarded thể thi increments quầy biến từ đến Khi kiểm soát "bỏ qua" quyền brace cuối guarded thể, chấm dứt handler thi decrements cập quay lại Giá trị in Đây biến thể phức tạp hơn: VOID RandomFunction(PLONG pcounter) { 7/19 Trình bày lỗi (Lỗi xử lý) try { ++*pcounter; return; } finally { *pcounter; } } Kết hàm này, thay đổi để nguyên cuối pcounter trỏ: kiểm soát guarded thể cho lý gì, bao gồm tuyên bố trở lại goto, chấm dứt handler thi Đây tăng dần thận trọng thể truy cập thực trở lại static LONG counter = 0; try { ++counter; BadActor(); } finally { counter; } 8/19 Trình bày lỗi (Lỗi xử lý) Hãy thử-Ngoại trừ Blocks Các cách khác để sử dụng cấu trúc ngoại lệ bao gồm việc xử lý thử-ngoại trừ khối: try { } except() { } EXCEPTION_EXECUTE_HANDLER nhiều cho hệ điều hành để chuyển giao kiểm soát bạn ngoại trừ handler Nếu handler té ngã bạn thông qua việc kết thúc quyền brace, tiếp tục kiểm soát bạn chương trình tuyên bố sau phải brace (Tôi thấy Platform SDK tài liệu hướng dẫn cho có hiệu lực trở để kiểm soát điểm ngoại lệ, không xác • EXCEPTION_CONTINUE_SEARCH nhiều cho hệ điều hành mà bạn không xử lý ngoại lệ Hệ thống giữ hàm quét up the stack tìm kiếm handler khác Nếu người cung cấp handler cho ngoại lệ, hệ thống sụp đổ xảy • EXCEPTION_CONTINUE_EXECUTION nhiều -1 cho hệ điều hành để trở lại điểm, nơi ngoại lệ nâng lên Tôi có thêm chút để nói việc biểu giá trị thêm vào Hãy xem Hình 3-4 cho đường kiểm soát xung quanh thử-trừ khối Bottom of Form Bottom of Form 9/19 Trình bày lỗi (Lỗi xử lý) Hình 3-3 Luồng điều khiển khối try - finally Đây ví dụ đơn giản: LONG counter = 0; try { ++counter; } finally { counter; } KdPrint(("%d\n", counter)); Trước tiên thực thi phần thân tăng biến đếm từ lên Khi điều khiển “drops through” cuối phần thân, kết thúc trình xử lý giảm biến đếm tới Bởi giá trị in Đây ví dụ phức tạp 10/19 Trình bày lỗi (Lỗi xử lý) VOID RandomFunction(PLONG pcounter) { try { ++*pcounter; return; } finally { *pcounter; } } Kết hàm không thay đổi giá trị nguyên cuói trỏ: lúc điều khiển dời dến phần thân với lý gi, bao gồm câu lệnh trả goto, viếc thực thi kết thúc Đây phần tăng biến đếm trả giá trị Ở đoạn code thực thi giảm biến đếm sau chương trình thực lại Một ví dụ hoàn chỉnh khối try-finally: static LONG counter = 0; try { ++counter; BadActor(); } finally 11/19 Trình bày lỗi (Lỗi xử lý) { counter; } Chúng ta gọi hàm, BadActor, xuất vài xếp ngoại lệ kích hoạt stack hoạt động Như phần tiến trình nghỉ thực ngoại lệ ngăn xếp, hệ điều hành gọi mã code để khôi phục lại biến đếm tới giá trị trước hệ thống tiếp tục giải phóng stack, câu lệnh viết sau khối finally không thực Khối Try – Except Một cách khác để sử dụng cấu trúc xử lý ngoại lệ khối try-Except try { } except() { } Phần thân khối try-except mã có sức mạnh phá vỡ phát sinh ngoại lệ Có lẽ bạn gọi tới phần hàm MmProbeAndLockPages sử dụng trỏ chuyển hoá từ chế độ người dùng không cần kiểm tra giá trị rõ ràng Có thể bạn có lý khác Trong trường hợp bạn quản lý tất cách thông qua phần thân lỗi, điều khiển tiếp tục mã code xử lý ngoại lệ phần sau Bạn nghĩ trường hợp trở lên bình thường Nếu ngoại lệ xuất mã code bạn tiến trình mà bạn gọi, nhiên, hệ điều hành giải phóng stack, đánh giá biểu thức câu lệnh Except Những biểu thức sinh giá trị sau: • EXCEPTION_EXECUTE_HANDLER có giá trị bàng thông báo cho hệ điều hành để chuyển điều khiển tới việc xử lý ngoại lệ bạn Nếu việc xử lý 12/19 Trình bày lỗi (Lỗi xử lý) bạn thất bại, đièu khiẻn tiếp tục chương trình bạn câu lệnh sau đó.( Tôi xem tài liệu Platform SDK nói hiệu ứng mà điều khiển trả ngoại lệ điểm ngoại lệ, đièu không đúng) • EXCEPTION_CONTINUE_SEARCH có giá trị thông báo với hệ điều hành bạn xử lý ngoại lệ Hệ thống quét qua stack để tìm kiếm xử lý khác Nếu không cung cấp xử lý cho ngoại lệ hệ thống đổ vỡ xảy • EXCEPTION_CONTINUE_EXECUTION có giá trị -1 thông báo cho hệ điều hành trả diểm nơi mà ngoại lệ sinh Tôi có mọt để nói giá trị biểu thức nhièu Nhìn hình 3-4 điều khiển đường dẫn xung quanh khối try-except Hình 3-4 Flow of control in a try-except block Cho ví dụ, bạn bảo vệ bạn khỏi nhận trơ sai sử dụng mã code sau PVOID p = (PVOID) 1; try { KdPrint(("About to generate exception\n")); ProbeForWrite(p, 4, 4); KdPrint(("You shouldn't see this message\n")); 13/19 Trình bày lỗi (Lỗi xử lý) } except(EXCEPTION_EXECUTE_HANDLER) { KdPrint(("Exception was caught\n")); } KdPrint(("Program kept control after exception\n")); ProbeForWrite kiểm tra vùng liệu cho tính hợp lệ Ở ví dụ này, gây ngoại lệ trỏ mà cung cấp chưa liên kết tới byte Việc xử lý ngoại lệ tăng tốc đièu khiển Điều khiển sau thực câu lệnh sau xử lý ngoại lệ tiếp tục chương trình bạn Trong ví dụ trước, có bạn trả giá trị EXCEPTION_CONTINUE_SEARCH, hệ điều hành tiếp tục giải phóng stack tìm kiếm xử lý ngoại lệ Không có mã code xử lý ngoại lệ bạn mã sau thực thi: Mọi hệ thống bị phá huỷ xử lý ngoại lệ mức cao Bạn không nên trả EXCEPTION_CONTINUE_EXECUTION phần nhân bạn cách dể thay đổi nguyên nhân gây ngoại lệ phép thử lại Chú ý bạn bẫy ngoại lệ số học, trang lỗi liên kết trỏ kiểu nhân sai, việc sử dụng cấu trúc ngoại lệ Bạn cần viết mã để không phát sinh ngoại lệ Đó làm để tránh chia cho Như ví dụ sau ULONG numerator, denominator; // [...]... khiển tới việc xử lý ngoại lệ của bạn Nếu việc xử lý 12/19 Trình bày lỗi (Lỗi xử lý) của bạn thất bại, đièu khiẻn sẽ tiếp tục chương trình của bạn ở câu lệnh ngay sau đó.( Tôi đã xem tài liệu Platform SDK nói về hiệu ứng mà điều khiển trả ra ngoại lệ tại điểm của ngoại lệ, nhưng đièu đó không đúng) • EXCEPTION_CONTINUE_SEARCH có giá trị bằng 0 và thông báo với hệ điều hành rằng bạn không thể xử lý ngoại... status, 0); 16/19 Trình bày lỗi (Lỗi xử lý) } (CompleteRequest là một hàm giúp đỡ tôi sử dụng để xử lý đòi hỏi hoàn thành I/O Chương 5 giải thích tất cả về yêu cầu I/O và hoàn thành chúng.) Lần khác khi sử dụng một xử lý ngoại lệ là khi bạn muốn truy cập bộ nhớ người dùng sử dụng một con trỏ từ nguồn không đáng tin Trong ví dụ dưới đây, cho rằng bạn thu được con trỏ p từ một chương trình người dùng... except(EXCEPTION_EXECUTE_HANDLER) { NTSTATUS status = GetExceptionCode(); } Bug Checks 17/19 Trình bày lỗi (Lỗi xử lý) Những lỗi không thể phục hồi đươc trong kiểu nhân có thể biêur thị chính nó trong cái goi là màn hình xanh của sự chết(BSOD) đó là tất cả quá quen thuộc đối với lập trình viên Hình 3-5 là một ví dụ Bên trong, những lỗi này được gọi là kiẻm tra rối,sau đó dịch vụ hàm bạn sử dụng để chuẩn đoán sự... gọi hàm này bởi vì những lý do sau: Nói cụ thể, đưa ra ngoại lệ không phải là cách tốt để nói cho đối tượng gọi của bạn thông tin mà bạn khám phá ra trong việc xử lý các tiến trình thông thường Nó tốt hơn nhiều để 15/19 Trình bày lỗi (Lỗi xử lý) trả về một trạng thái mã, thậm chí như thể là sự chỉ dẫn từ bên ngoài khó đọc hơn Bạn nên tránh những ngoại lệ bởi vì máy móc rất dắt tiền Thậm chí giá của... thực thi và giảm biến đếm sau đó chương trình con sẽ thực hiện lại Một ví dụ hoàn chỉnh của khối try-finally: static LONG counter = 0; try { ++counter; BadActor(); } finally 11/19 Trình bày lỗi (Lỗi xử lý) { counter; } Chúng ta gọi đây là một hàm, BadActor, nó sẽ xuất hiện một vài sự sắp xếp của ngoại lệ kích hoạt một stack hoạt động Như một phần của tiến trình nghỉ thực hiện và ngoại lệ ngăn xếp,... 14/19 Trình bày lỗi (Lỗi xử lý) Theo cách thông thường, giá trị thực mà một nhân thành phần đưa cho bạn Tôi không cho rằng bạn không nên chia nhỏ đoận mã của bạn với câu lệnh ASSERT bạn nên bởi vì bạn có thể không hiểu tất cả bên trong và bên ngoài cách làm việc của thành phần nhân khác như thế nào Tôi cho rằng bạn không cần đè nặng trình điều khiẻn của bạn với sự phòng thử quá mức chống lại lỗi ở... shouldn't see this message\n")); 13/19 Trình bày lỗi (Lỗi xử lý) } except(EXCEPTION_EXECUTE_HANDLER) { KdPrint(("Exception was caught\n")); } KdPrint(("Program kept control after exception\n")); ProbeForWrite kiểm tra một vùng dữ liệu cho tính hợp lệ Ở ví dụ này, nó sẽ gây ra một ngoại lệ bởi vì con trỏ mà chúng ta cung cấp chưa được liên kết tới 4 byte Việc xử lý ngoại lệ tăng tốc đièu khiển Điều.. .Trình bày lỗi (Lỗi xử lý) VOID RandomFunction(PLONG pcounter) { try { ++*pcounter; return; } finally { *pcounter; } } Kết quả của hàm này là không thay đổi giá trị nguyên ở cuói của con trỏ: bất cứ lúc nào điều... thể thực hiện được vì kiểm tra rối Chính kiểm tra rối của Microsoft xuất hiện trong bugcodes.h Sụ giải thích về mã của họ có thể tìm thấy trong Những kiến thức cơ bản Q103059 a fuller 18/19 Trình bày lỗi (Lỗi xử lý) explanation of the codes and their various parameters can be found in Knowledge Base article Q103059, “Descriptions of Bug Codes for Windows NT,” cái mà có sẵn trong MSDN, giữa những chỗ... nói khi nào bạn làm nó: không bao giờ Hoặc trong khi xây dựng kiểm tra của trình điều khiển đẻ sử dụng trong suốt bên trong quá trình gỡ rối Bạn và tôi đều không chắc chắn để viết một trình diều khiển mà sẽ phát hiện một lỗi nghiêm túc đến nỗi lấy xuống hệ thống là cách giải quyết duy nhất Nó sẽ tốt hơn nhiều gỡ lỗi( sử dụng gỡ lỗi tôi sẽ mô tả trong chương 14 ) và trả ra một mã tình trạng Chú ý rằng ... hệ điều hành để chuyển điều khiển tới việc xử lý ngoại lệ bạn Nếu việc xử lý 12/19 Trình bày lỗi (Lỗi xử lý) bạn thất bại, đièu khiẻn tiếp tục chương trình bạn câu lệnh sau đó.( Tôi xem tài liệu... } Bug Checks 17/19 Trình bày lỗi (Lỗi xử lý) Những lỗi phục hồi đươc kiểu nhân biêur thị goi hình xanh chết(BSOD) tất quen thuộc lập trình viên Hình 3-5 ví dụ Bên trong, lỗi gọi kiẻm tra rối,sau.. .Trình bày lỗi (Lỗi xử lý) Bạn nên luôn kiểm tra tình trạng tra từ thủ tục mà họ cung cấp Tôi dừng kết nguyên tắc thường xuyên số đoạn mã cho bạn bao gồm tất lỗi cần thiết xử lý mã thường

Ngày đăng: 31/12/2015, 22:13

TỪ KHÓA LIÊN QUAN

w