Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Sử dụng SEH để bắt lỗi hệ thống

  1. #1
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định Sử dụng SEH để bắt lỗi hệ thống

    Các ngôn ngữ như C#, Java đều có try catch để bắt các lỗi phát sinh trong chương trình. Trong VC++ cũng có một cách để thực hiện được điều này, đó là dùng cấu trúc SEH. Cấu trúc SEH cho phép bắt các lỗi nặng ( lỗi thường gây ra don't send ), chỉ trừ lỗi tràn stack. Lý do là vì cấu trúc SEH được lưu trong stack, nếu tràn stack rồi thì còn chỗ đâu mà lưu. Điểm dở duy nhất của SEH chính là nó không dùng được trong hàm thành viên của lớp.

    Sau đây là cách khai báo, rất đơn giản :

    C++ Code:
    1. __try
    2. {
    3.     // nhét đoạn code cần bắt lỗi vào đây
    4. }
    5. __except (1)
    6. {
    7.     // xử lý lỗi
    8. }
    Như vậy là xong. Bây giờ mình sẽ demo xem khả năng bắt lỗi của SEH như thế nào nha.

    C++ Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.     int *p = NULL;
    7.     int num = 0;
    8.    
    9.     //__try
    10.     {
    11.         printf("Access violation.\n");
    12.         p[0] = 0;
    13.     }
    14.     //__except (1)
    15.     {
    16.         printf("Error 1\n");
    17.     }
    18.  
    19.     //__try
    20.     {
    21.         printf("Divide by zero\n");
    22.         num /= num;
    23.     }
    24.     //__except (1)
    25.     {
    26.         printf("Error 2\n");
    27.     }
    28.  
    29.     printf("Continue running\n");
    30.  
    31.     getch();
    32. }

    Các bạn thử chạy lần đầu, sau đó bỏ dấu comment đi để xem 2 lần khác nhau thế nào nha.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  2. #2
    Ngày gia nhập
    09 2008
    Bài viết
    328

    C++ Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. class abc
    4. {
    5. public:
    6.     int khoitao()
    7.     {
    8.         int *p = NULL;
    9.         int num = 0;
    10.        
    11.         __try
    12.         {
    13.             printf("Access violation.\n");
    14.             p[0] = 0;
    15.         }
    16.         __except (1)
    17.         {
    18.             printf("Error 1\n");
    19.         }
    20.        
    21.         __try
    22.         {
    23.             printf("Divide by zero\n");
    24.             num /= num;
    25.         }
    26.         __except (1)
    27.         {
    28.             printf("Error 2\n");
    29.         }
    30.        
    31.         printf("Continue running\n");
    32.        
    33.         getch();
    34.         return 0;
    35.     }
    36. protected:
    37. private:
    38. };
    39. void main()
    40. {
    41.     abc a;
    42.     a.khoitao();
    43.     return;
    44. }

    sao mình vẫn dùng được với hàm thành viên trong class nè mèo con lông vàng
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  3. #3
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    bỏ hết try và __except(1) đi để thấy

    không thì trong khoitao() trước getch() in ra giá trị của num và p
    None!

  4. #4
    Ngày gia nhập
    09 2008
    Bài viết
    328

    bạn hiểu nhầm ý của mình rồi,bạn meocon bên trên có nói rằng không thể sử dụng SEH bên trong hàm con của class vậy mà mình để nó bên trong class cũng không sao cả
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi trần trân Xem bài viết
    bạn hiểu nhầm ý của mình rồi,bạn meocon bên trên có nói rằng không thể sử dụng SEH bên trong hàm con của class vậy mà mình để nó bên trong class cũng không sao cả
    Ờ đúng thế thật. Hôm bữa mình search đâu đó trên mạng nghe nói thế nên nói theo, chưa test thử.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Mặc định Sử dụng SEH để bắt lỗi hệ thống

    Compiler sẽ báo lỗi khi:
    1. SEH dùng chung được với C++ exception handing trong cùng 1 hàm
    2. SEH dùng trong 1 hàm có object hay bất cứ gì khởi tạo trên stack và tự hủy khi ra khỏi hàm.
    SEH nhẹ, nhỏ và nhanh hơn C++ exception vì được OS hổ trợ. SEH sử dụng được trong kernel mode. Không phải compiler nào cũng support syntax của SEH (Structure Exception Handling).

  7. #7
    Ngày gia nhập
    09 2008
    Bài viết
    328

    chỉ trừ lỗi tràn stack. Lý do là vì cấu trúc SEH được lưu trong stack, nếu tràn stack rồi thì còn chỗ đâu mà lưu. Điểm dở duy nhất của SEH chính là nó không dùng được trong hàm thành viên của lớp.
    Lỗi tràn bộ đệm thế này nó cũng không bắt được nè,mình thử dùng VC++ 2008 bắt lỗi thì thấy nó không bắt được,làm thế nào để bắt được bây giờ nhỉ

    C++ Code:
    1. #include<iostream>
    2. #include<windows.h>
    3. using namespace std;
    4. int main()
    5. {
    6.     char a[10];
    7.     __try
    8.     {
    9.         lstrcpy(a,"1234567890123456789");//co 19 so trong khi do chi cap phat cho 10 so
    10.     }
    11.     __except (1)
    12.     {
    13.         MessageBoxA(0,"Loi tran bo nho dem ","Thong bao",0);
    14.     }
    15.     return 0;
    16. }
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  8. #8
    Ngày gia nhập
    02 2009
    Bài viết
    20

    Không chắc gì lstrcpy(a,"1234567890123456789") sẽ gây ra lỗi tràn bộ đệm bởi vì đằng sau 10 byte của mảng a có thể là vùng nhớ của biến khác, tức là vẫn có thể truy xuất được. Nó chỉ gây ra lỗi logic cho chương trình mà thôi.
    Đang viết truyện

  9. #9
    Ngày gia nhập
    09 2008
    Bài viết
    328

    vậy giải quyết vấn đề này thế nào,VD mình chỉ cấp phát có 10 phần tử cho 1 chuỗi,mình chỉ muốn làm thế nào mà người dùng chỉ nhập 1 chuỗi dưới 10 phần tử thôi,nếu người ta nhập quá thì mình sẽ không thực hiện lệnh nhập nữa và ra thông báo cho người dùng
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  10. #10
    Ngày gia nhập
    02 2009
    Bài viết
    20

    Cái này là lỗi logic nên theo mình chỉ có cách là nhập từng ký tự rồi dùng if để kiểm tra thôi.
    Đang viết truyện

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn