2010-11-23 33 views
5

Tôi đã có một số cuộc gọi OutputDebugString "giả mạo" trong ứng dụng của tôi mà in ra "T", nhưng tôi không thể chỉ định vị nó.Gỡ lỗi OutputDebugString cuộc gọi trong Delphi

Có thể nào đó để đặt điểm ngắt trên OutputDebugString -function và xem nó được gọi từ đâu không?

Tôi đang sử dụng Delphi 2009.

Trả lời

13

Có bao nhiêu cuộc gọi đến OutputDebugString đang có trong dự án của bạn? Bạn có thể sử dụng hộp thoại "Tìm trong tệp" để tìm tất cả và nếu chúng không quá nhiều, sẽ không có vấn đề gì.

Nếu không, bạn có thể - tất nhiên - hãy sử dụng tìm kiếm và thay thế và thay thế tất cả OutputDebugString( bằng raise Exception.Create(.

Bạn cũng có thể viết một hàm

procedure OutputDebugString(const Str: string); 
begin 
    raise Exception.Create(Str); 
end; 

trong một đơn vị được sử dụng bởi tất cả các đơn vị khác trong dự án. Nếu chỉ có đơn vị mới này được khai báo sau Windows.pas trong danh sách uses, hàm mới này sẽ được sử dụng thay cho hàm Windows.pas.

Cập nhật

Có, bạn có thể đặt điểm ngắt trong Windows.pas. Trước tiên, trong dự án của bạn, hãy vào Tùy chọn dự án và trong Gỡ lỗi, chọn "Sử dụng gỡ lỗi DCUs". Sau đó, bạn có thể đi đến Windows.pas và đặt một breakpoint tại dòng 30.769:

procedure OutputDebugString; external kernel32 name 'OutputDebugStringW'; 
+1

Quá nhiều lây lan trên toàn bộ dự án và thành phần .. Tôi thậm chí không chắc liệu thư có đến từ mã của riêng hay mã của bên thứ ba hay không. – Harriv

+0

Có, gỡ lỗi DCU thực hiện điều đó. Bây giờ tôi chỉ cần tìm ra cách để thiết lập điều kiện .. – Harriv

+2

nếu nó không phải là mã của bạn nhưng một số đơn vị bạn sử dụng (gián tiếp) cuộc gọi cũng có thể đi đến OutputDebugStringA. – Remko

7
  • Chạy ứng dụng của bạn.
  • Đặt tạm dừng.
  • Mở/Gỡ lỗi cửa sổ/Mô-đun cửa sổ.
  • Tìm kiếm kernel32.dll. Nhấp đúp vào nó.
  • Tìm kiếm OutputDebugStringA. Double nhấp vào nó.
  • Cửa sổ CPU mở ra. Đặt điểm ngắt tại dòng đầu tiên.
  • Tìm kiếm OutputDebugStringW. Double nhấp vào nó.
  • Cửa sổ CPU mở ra. Đặt điểm ngắt tại dòng đầu tiên.

Xong.

Bây giờ mọi cuộc gọi đến OutputDebugString từ ứng dụng của bạn sẽ bị ngắt tại điểm ngắt. Bạn cũng có thể bật tính năng ghi nhật ký trong các thuộc tính điểm ngắt để ghi nhật ký ngăn xếp cuộc gọi.

Các vấn đề liên quan