Vì vậy, tôi muốn đặt điểm ngắt trong một thông báo API hoặc Windows cụ thể. Tôi không tìm thấy bất kỳ cách dễ dàng để làm điều đó mà không cần viết mã trong bất kỳ phiên bản Delphi nào. Có cách nào để làm điều đó tương tự như tôi có thể đặt điểm ngắt trong truy cập bộ nhớ không?Có bất kỳ cách nào nhanh chóng, trong khi gỡ lỗi, để dừng tại một Windows Message hoặc API cụ thể?
Có bất kỳ cách nào nhanh chóng, trong khi gỡ lỗi, để dừng tại một Windows Message hoặc API cụ thể?
Trả lời
Để dừng tại bất kỳ lệnh gọi nào đến chức năng API, hãy tìm nó trong phần implementation
của Windows.pas (hoặc bất kỳ nơi nào chức năng quan tâm được khai báo) và đặt điểm ngắt. Điều đó đảm nhận các chức năng bạn sử dụng với liên kết động thời gian tải. Đối với liên kết động thời gian chạy (LoadLibrary
và GetProcAddress
), bạn sẽ cần một kỹ thuật khác. Biến được kết quả là GetProcAddress
sẽ giữ địa chỉ bạn muốn ngắt, nhưng tôi không biết cách đặt breakpoint tại địa chỉ đó.
Dừng trên cửa sổ thư là phức tạp hơn vì thư có thể được truy xuất ở nhiều nơi. Bạn sẽ phải sử dụng các điểm ngắt có điều kiện để thay thế.
Để bắt hầu hết các thư đã đăng, bạn có thể đặt điểm ngắt trong TApplication.HandleMessage
trên dòng đầu tiên sau khi gọi tới PeekMessage
. Đặt điều kiện là Msg.Message = x
. HandleMessage
quản lý các tin nhắn được gửi đến hàng đợi tin nhắn của chuỗi chính cho vòng lặp tin nhắn chính Application.Run
cũng như các vòng tin nhắn phương thức của VCL. Tuy nhiên, các hộp thoại phương thức khác (chẳng hạn như Windows.MessageBox
) sẽ không sử dụng nó.
Quan sát gửi thông báo khó hơn vì hệ điều hành gửi chúng đến thủ tục cửa sổ mục tiêu của họ trực tiếp. Bạn sẽ phải thiết lập một điểm ngắt trong quy trình cửa sổ của mỗi lớp cửa sổ mà bạn quan tâm. Bạn có thể nhận được hầu hết các lớp cửa sổ VCL bằng cách đặt điểm ngắt có điều kiện của bạn trong Classes.StdWndProc
.
Hãy nhớ rằng các điểm ngắt có điều kiện có thể rất chậm. Chúng hoạt động bởi trình gỡ lỗi đặt điểm ngắt vô điều kiện không có điều kiện ở đó và khi hệ điều hành kích hoạt nó, trình gỡ lỗi sẽ tiếp quản, kiểm tra điều kiện và sau đó tiếp tục thực hiện nếu điều kiện không thành công. Điều đó có thể liên quan đến rất nhiều chi phí, chuyển đổi giữa trình gỡ lỗi và ứng dụng của bạn; các chương trình nhận được lô thư, vì vậy nếu bạn có thể tìm cách tránh trình gỡ lỗi gián đoạn chương trình của bạn, hãy kiểm tra mỗi một trong số đó, hãy thực hiện.
Nếu điều này không khả thi đối với bất cứ điều gì bạn đang cố gỡ lỗi, thì tôi khuyên bạn nên đăng câu hỏi mới nơi bạn mô tả sự cố bạn đang thực sự cố giải quyết.
Bạn sẽ cần phải đi vào Tùy chọn | Linker và kiểm tra "Debug DCUs". theo mặc định, điều này không được kiểm tra để trình gỡ rối không bước qua toàn bộ VCL khi bạn đang cố gắng làm việc.
Bên cạnh đây là nhận xét hợp lệ và quan trọng. Tôi không yêu cầu một cách để gỡ lỗi VCL. Bạn không thể bình luận với danh tiếng thấp ... Đó không phải là mát mẻ. Tôi biết... :( – EMBarbosa
- 1. Có bất kỳ API Win32 nào để kích hoạt chế độ ngủ đông hoặc tạm dừng trong Windows không?
- 2. Bất kỳ công cụ tốt nào để nhanh chóng chuyển đến tài liệu lập trình
- 3. Cách nhanh chóng để xác định xem một PID có tồn tại trên (Windows) không?
- 4. Làm thế nào bạn có thể dừng Visual Studio sắp xếp lại Windows khi gỡ lỗi
- 5. Magento không gửi bất kỳ thư nào, cách gỡ lỗi?
- 6. Có cách nào nhanh chóng để xóa một giá trị cụ thể khỏi một mảng trong Javascript không?
- 7. SMLNJ có bất kỳ loại trình gỡ lỗi nào không?
- 8. Không thể gỡ bỏ nhanh chóng nhiều file trong Git
- 9. là có bất kỳ công cụ hoặc IDE để gỡ lỗi R gói và chạy nó từng bước?
- 10. cho đường ray actionmailer, bất kỳ cách nào để gỡ lỗi ActionView :: Template :: Lỗi lỗi?
- 11. Có bất kỳ IDE Windows Perl miễn phí nào với gỡ lỗi không?
- 12. Có thể dừng một luồng trong khi gỡ lỗi trong Linux không?
- 13. Làm thế nào để nhanh chóng kiểm tra Windows Gadgets?
- 14. Đợi bất kỳ tương lai cụ thể nào trong Scala?
- 15. Cách dừng hẹn giờ trong khi gỡ lỗi
- 16. Có bất kỳ công cụ gỡ rối đồng thời nào cho C# .NET trong VS2010
- 17. Dừng và Bắt đầu IIS theo chương trình. Một cách nhanh chóng và an toàn
- 18. bất kỳ cách nào để đếm tweet tweet của một người dùng cụ thể bằng Twitter API?
- 19. Phát hiện khi nào là Firebug (hoặc bất kỳ trình gỡ rối web nào khác) được sử dụng để gỡ lỗi
- 20. IntelliJ - tạm dừng một luồng trong khi gỡ lỗi
- 21. cách chụp gói tại một cổng cụ thể trên bất kỳ giao diện nào bằng tshark
- 22. Nút hoa nhài có cung cấp bất kỳ tùy chọn "không nhanh" nào không?
- 23. Đang tải jQuery một cách nhanh chóng
- 24. Làm thế nào để dừng gỡ lỗi (hoặc tách quy trình) mà không dừng quá trình?
- 25. Cách nhanh nhất có thể để bắt màn hình là gì? Bất kỳ ngôn ngữ
- 26. Có cách nào nhanh chóng để kiểm tra xem cột BẤT CỨ là NULL không?
- 27. Có cách nào nhanh chóng để có được mọi liên kết giữa hai thực thể không?
- 28. Có bất kỳ Công cụ hoặc API nào để tự động cập nhật cấu trúc cơ sở dữ liệu
- 29. Cách xem một DataTable trong khi gỡ lỗi
- 30. Làm thế nào để hiểu được thiết kế và lưu lượng mã của bất kỳ sản phẩm nào một cách nhanh chóng?
Bạn có thể thêm điểm ngắt tại một địa chỉ cụ thể ... Vào cửa sổ điểm ngắt sau khi bạn chạy ứng dụng đã bị hỏng tại điểm ngắt (như tại cuộc gọi đến 'GetProcAddress'), nắm bắt địa chỉ của quy trình bằng cách nào đó, mở cửa sổ breakpoint, nhấp chuột phải và chọn Add> Address Breakpoint. Sau đó bạn đưa vào địa chỉ. Trình gỡ lỗi sẽ bị hỏng khi truy cập địa chỉ đó. Lưu ý: Địa chỉ rõ ràng chỉ hợp lệ đối với yêu cầu thực thi của bạn. – Nat
+1. Câu hỏi này được thúc đẩy bởi một đồng nghiệp mới là một người dùng Delphi mới. Ông đã bỏ lỡ một thực tế rằng trong Visual Basic ông có thể làm một loại "theo dõi chuyển động người dùng tiếp theo" (trong khi gỡ lỗi, trình gỡ lỗi dừng lại trên người dùng nhấp, nhập, vv ... nhưng không phải trong khi ứng dụng là "nhàn rỗi"). Sử dụng callstack, tôi không bao giờ cảm thấy cần thiết. Nhưng nhận ra rằng tôi có thể sử dụng BP trong WindowsAPI và Messages để giải quyết một số lỗi lạ.Như tôi đã nhớ rằng trong một trình gỡ lỗi nâng cao khác, tôi chỉ có thể thực hiện 'BPX WM_GETTEXTA' trong cửa sổ bảng điều khiển, tôi đã tự hỏi liệu Delphi có dễ dàng hơn không. – EMBarbosa
@Nat hmmm ... Có lẽ tôi có thể sử dụng một số API của Delphi Debugger mới để tự động hóa tác vụ đó ... Nhưng tôi không quá quen thuộc với điều đó ... Đây có phải là một câu hỏi hay không? – EMBarbosa