cuốn sách gpt4 ai đã làm

Phân tích hệ thống máy kiểm tra mồ hôi .NET

In lại Tác giả: Sahara Thời gian cập nhật: 2024-12-31 12:42:47 59 4
mua khóa gpt4 Nike

1: Bối cảnh

1. Kể chuyện

Tháng trước về cộng đồng có tương đối ít bài viết. có rất nhiều việc vặt trong thời gian được quyết định nên mình có rất nhiều lĩnh vực cần chia sẻ. trong khoảng thời gian này nên mình sẽ chia sẻ từng cái một với các bạn. Sửa lỗi nâng cấp .NET phiên bản mới sau năm mới, vì vậy hãy bắt kịp thời gian và sản phẩm như điên!

Đây là vụ sản xuất nạn nhân được đưa ra cho một người được bạn huấn luyện viên huấn luyện ở trại huấn luyện, những người bạn không nên phân tích nhờ tôi xem xét giúp đỡ, kinh nghiệm sửa xe của tôi cũng tương đối phong phú, có thể coi là như vậy là chắc chắn. Chắc chắn đằng sau họ, không có gì nhiều để nói, hãy nói chuyện trên windbg.

2: Phân tích WinDbg

1. Tại sao nó được treo

Vì Windbg tự động định vị luồng bị lỗi theo mặc định và tâm điểm của cố gắng xuất ra là cảnh bối cảnh trước sự cố của nó, lệnh .ecxr và k được sử dụng ở đây.


0:000> .ecxr eax=00000000 ebx=4d6d8360 ecx=00000003 edx=00000000 esi=4d6f0ca0 edi=4d6f0c74 eip=71a567c7 esp=026fd834 ebp=026fd83c iopl=0 nv up di pl nz na po nc cs=0000 ss=0000 ds=0000 es=0000 fs=0000 gs=0000 efl=00000000 System_Windows_Forms_ni!System.Windows.Forms.ImageList.ImageCollection.SetKeyName+0x1b: 71a567c7 cc int 3 0:000>k *** 0c2c4e7e System_Windows_Forms_ni!System.Windows.Forms.ImageList.ImageCollection.SetKeyName+0x1b 01 026fe474 0c2c063b xxx!xxx.MainForm.InitializeComponent+0x198e 02 026fe488 095cb9de xxx!xxx.MainForm..ctor+0x5fb 03 026fe4e4 0da5bc7a xxx!xxx.LoginForm.button_OK_Click+0x52e 04 026fe4f8 71a38bdf xxx!xxx.LoginForm.LoginForm_Load+0x9a 05 026fe528 710b325a System_Windows_Forms_ni!System.Windows.Forms.Form.OnLoad+0x2f ...

System.Windows.Forms.ImageList.ImageCollection.SetKeyName System.Windows.Forms.ImageList.ImageCollection.SetKeyName. SDK phiên bản của Microsoft. cụ cố định.


0:000> !t ThreadCount: 26 UnstartedThread: 0 BackgroundThread: 12 PendingThread: 0 DeadThread: 13 Hosted Runtime: no Lock ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception 0 1 534 0299e700 a6028 Ưu tiên 4D6F0EFC:00000000 02997bd0 0 STA System.IndexOutOfRangeException 4d6f0ca0 2 2 5b4 029af278 2b228 00000000:00000000 02997bd0 0 MTA (Hoàn thiện) 3 6 ff0 02a60eb0 102a228 Ưu tiên 00000000:00000000 02997bd0 0 MTA (Threadpool Worker) ... 0:000> !pe Đối tượng ngoại lệ: 4d6f0ca0 Loại ngoại lệ: System.IndexOutOfRangeException Thông báo: Chỉ mục nằm ngoài giới hạn của mảng InnerException:  StackTrace (có thể tạo): Chức năng IP SP 026FD834 71A567C7 System_Windows_Forms_ni!System.Windows.Forms.ImageList+ImageCollection.SetKeyName(Int32, System.String)+0x33e157 StackTraceString:  Kết quả: 80131508

Nó rất lạ so với thẻ. cơ sở lỗi? cấp độ lỗi như vậy .

2. Đây thực sự là lỗi trong cơ sở thư viện?

Để tìm câu trả lời, bạn có thể tìm cơ sở mã nguồn dựa trên các chức năng trên phân luồng và tìm câu trả lời từ mã nguồn được cắt giảm như sau:


        void riêng tư Khởi tạoComponent() { this.imageList_btnbg.ImageStream = (System.Windows.Forms.ImageListStreamer)resources.GetObject("imageList_btnbg.ImageStream" ​this.imageList_btnbg.TransparentColor = System.draw.Color.Transparent cái này. imageList_btnbg Images.SetKeyName(0, "normal-main.bmp"); this.imageList_btnbg.Images.SetKeyName(1, "focus-main.bmp"); this.imageList_btnbg.Images.SetKeyName(2, "select-main. bmp"); .Images.SetKeyName(3, "gray-main.bmp"); this.imageList_btnbg.Images.SetKeyName(4, "down_1.png"); this.imageList_btnbg.Images.SetKeyName(5, "down_2.png"); this.imageList_btnbg.Images.SetKeyName(6, "down_3.png") ; this.imageList_btnbg.Images.SetKeyName(7, "up_1.png"); this.imageList_btnbg.Images.SetKeyName(8, "up_2.png"); this.imageList_btnbg.Images.SetKeyName(9, "up_3.png" } public void SetKeyName(int mục chỉ, tên chuỗi ) { if (!IsValidIndex(index)) { Ném IndexOutOfRangeException new() } if (imageInfoCollection[index] == null) { imageInfoCollection[index] = new ImageInfo(); } ((ImageInfo)imageInfoCollection[index]).Name = name } public bool IsValidIndex(int ​​​​index) { if (index > = 0 ) { trả chỉ mục < Đếm } trả về sai; } public int Count { get { if (owner.HandleCreated) { return SafeNativeMethods.ImageList_GetImageCount(new HandleRef(owner, owner.Handle) } int num = 0; ) { if (bản gốc != null) { num += original.nImages; ; } } [Có thể duyệt (sai)] [EditorBrowsable(EditorBrowsableState.Advanced)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [SRDescription("ImageListHandleCreatedDescr")] public bool HandleCreated => localImageList != null;

Đọc kỹ năng mã hóa logic trong que, có vẻ như ngoại lệ IndexOutOfRangeException thủ công là do IsValidIndex()=false và IsValidIndex()=false là điều kiện của chỉ mục < ImageList_GetImageCount hoặc owner.origins.

Chúng tôi đã phân tích rõ ràng mã hóa logic. Khởi chạyComponent().


0:000> !clrstack OS Thread Id: 0x534 (0) Child SP Call Site 026fd784 771316bc [HelperMethodFrame: 026fd784] 026fd834 71a567c7 System.Windows.Forms.ImageList+ImageCollection.SetKeyName(Int32, System.String) 026fd848 0c2c4e7e xxx.MainForm.InitializeComponent() 026fe47c 0c2c063b xxx.MainForm..ctor() 026fe490 095cb9de xxx.LoginForm.button_OK_Click(System.Object, System.EventArgs) ... 0:000> !U /d 0c2c4e7e Mã được tạo JIT bình thường xxx.MainForm.InitializeComponent() Bắt đầu 0c2c34f0, kích thước 5ded ... 0c2c4e62 e8d9b5d864 gọi System_Windows_Forms_ni+0x160440 (71050440) (System.Windows.Forms.ImageList.get_Images(), mdToken: 06002599) 0c2c4e67 898514f5ffff mov dword ptr [ebp-0AECh],eax 0c2c4e6d ff35f0a07f05 đẩy dword ptr ds:[57FA0F0h] ("normal-main.bmp") 0c2c4e73 8bc8 mov ecx,eax 0c2c4e75 33d2 xor edx,edx 0c2c4e77 3909 cmp dword ptr [ecx],ecx 0c2c4e79 e8f2374565 gọi System_Windows_Forms_ni!System.Windows.Forms.ImageList.ImageCollection.SetKeyName (71718670) >>> 0c2c4e7e 8b8e74020000 mov ecx,dword ptr [esi+274h] ...

Đánh giá từ quẻ, Nima. . . Khi SetKeyName(0, "normal-main.bmp"); đầu tiên được thực thi, một ngoại lệ xảy ra. Điều này có nghĩa là Count=0. Tiếp theo, hãy tìm bộ sưu tập ImageCollection nguồn dữ liệu. Bạn có thể tìm thấy nó từ ngăn xếp luồng và sử dụng lệnh !dso.

0:000> !dso OS Thread Id: 0x534 (0) ESP/REG Tên đối tượng 026FD774 4d6f0c74 System.Windows.Forms.ImageList+ImageCollection 026FD778 4d6f0ca0 System.IndexOutOfRangeException ... 0:000> !do 4d6f0c74 Tên: System.Windows.Forms.ImageList+ImageCollection MethodTable: 71120ff0 EEClass: 70f230ec Kích thước: 20(0x14) byte Tệp: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll Các trường: Loại bù trừ trường MT Tên giá trị Attr 7111ecc0 4003916 4 ... Ví dụ s.Forms.ImageList 0 Chủ sở hữu 4d6d97b0 72d909dc 4003917 8 ...ections.ArrayList 0 phiên bản 4d6f0c88 imageInfoCollection 72d8df5c 4003918 c System.Int32 1 phiên bản -1 LastAccessedIndex 0:000> !DumpObj /d 4d6d97b0 Tên: System.Windows.Forms.ImageList ... Các trường: MT Loại bù trừ trường VT Attr Giá trị Tên 71121b0c 4001013 10 ...t+NativeImageList 0 phiên bản 4d6f0c40 NativeImageList 728e15a0 4001019 1c ...Collections.IList 0 phiên bản 00000000 bản gốc

Theo bản gốcImageList và các bản gốc trong quẻ và kết hợp với mã nguồn, nó phải là thủ phạm mà phương thức SafeNativeMethods.ImageList_GetImageCount trả về 0. Đầu tiên, hãy quan sát chữ ký của nó.


[DllImport("comctl32.dll")] public static extern int ImageList_GetImageCount(HandleRef hel);

Đánh giá từ chữ ký, đây là một phương thức bên ngoài được viết bằng C++, rất khó hiểu. . . Tôi không thể sử dụng ida để tìm ra logic ở đây. . . Có vẻ như chúng ta sắp tông vào bức tường phía nam ở đây. . . Có chút hoảng loạn.

3. Có phải Chúa muốn phá hủy con đường của mọi người?

Sau một hồi suy nghĩ, tôi chợt nảy ra một ý tưởng. Đây không phải là địa chỉ bộ nhớ 32 bit sao? Điều đó xảy ra là ImageList_GetImageCount là một điều khiển giao diện người dùng về hình ảnh và sử dụng các tài nguyên COM cơ bản. Có thực sự là do không đủ dung lượng không? Sau khi bạn có ý tưởng này, hãy nhanh tay lên! Địa chỉ -tóm tắt quan sát bộ nhớ đã cam kết.


0:000> !address -summary ... --- Tóm tắt trạng thái ---------------- RgnCount ----------- Tổng kích thước ---- ---- %ofBusy %ofTotal MEM_COMMIT 1933 6e768000 ( 1,726 GB) 93,52% 86,30% MEM_FREE 631 9e01000 ( 158,004 MB) 7,72% MEM_RESERVE 607 7a87000 ( 122,527 MB) 6,48% 5,98% ...

Chết tiệt. . . MEM_COMMIT=1.72G và %ofBusy= 93.52% trong quẻ đã vượt quá giá trị tới hạn là 1.2G và sự thật cuối cùng cũng được tiết lộ. . .

Giải pháp tương đối đơn giản. Kích hoạt địa chỉ lớn và để chương trình tiêu tốn 4G bộ nhớ. Sau đó, bạn bè đã báo cáo rằng sự cố này không còn xảy ra nữa. . .

Ba: Tóm tắt

Sau khi phân tích bãi rác này, tôi thực sự cảm thấy khá xúc động. Cuộc đời giống như một bãi rác, không ngừng đan xen giữa sự thật và ảo ảnh. Có người bước ra, có người ở lại trong đó mãi mãi. . .

Cuối cùng, bài viết này về phân tích sự cố hệ thống của máy kiểm tra mồ hôi .NET kết thúc tại đây. Nếu bạn muốn biết thêm về phân tích sự cố hệ thống của máy kiểm tra mồ hôi .NET, vui lòng tìm kiếm bài viết CFSDN hoặc duyệt qua các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

59 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress