簡體   English   中英

在同步模式下運行 windows GUI 應用程序?

[英]Run windows GUI application in synchronized mode?

我正在 windows 上調試 GUI 應用程序,我想找出誰是某些消息的發送者。 在 linux 上,我可以在同步模式下運行應用程序並在調用堆棧中找到發送者。 windows中是否有等效模式?

AFAIK 沒有內置的能力來做到這一點。

但是,讓我們首先調查一下這個問題。 你想知道誰是消息的發送者 但是,您應該知道 windows 消息處理可以按以下標准分類:

  1. 已發布與已發送消息( PostMessageSendMessage )。
  2. 發送到 window 的消息屬於另一個線程與發送者線程。
  3. 發布到線程的消息(未綁定到特定的 window,因此未由 window 過程處理)。

只有當消息被發送(未發布)到 window 時,您才可以直接跟蹤發件人,而對SendMessage (或類似的)的調用是在 window 所屬的線程中發出的。 在這種情況下,您將在調用堆棧中看到發件人。

如果消息是從另一個線程發送的 - 您將不會在調用堆棧中看到它。 僅僅是因為調用棧只顯示了屬於當前線程的調用鏈。 當從另一個線程發送消息時,系統執行以下操作:

  1. 掛起調用者線程。
  2. 將此消息放入擁有 window 的線程的隊列中。
  3. 當該線程調用GetMessage (或類似的)時 - 消息被分派到 window。
  4. 最后操作系統恢復調用者線程。 SendMessage返回 window 過程返回的結果。

在這種情況下,您可以嘗試間接識別調用者。 使用斷點中斷您的程序,並嘗試搜索掛起的線程,這些線程在對SendMessage或類似的調用中被阻塞。

最后,通過上述方法無法跟蹤發布的消息。 您可以嘗試在對PostMessage的調用上放置條件斷點,但如果調用者屬於另一個問題 - 這將更加復雜。

瓦爾多是正確的。 對 SendMessage 的調用直接調用您的應用程序 wndproc。 對 PostMessage 的調用將消息發布到消息隊列,然后您的應用程序通過消息泵(循環、getmessage、translatemessage、dispatchmessage)接收消息。 所以,就像他說的,如果消息是通過 SendMessage 發送的,那么 function 的被調用者將顯示在調用堆棧中。 如果它是通過 PostMessage 發送的,則不會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM