我在Windows上調試GUI應用程序,我想找出誰是某些消息的發件人。在linux上,我可以在synchronized mode中運行應用程序,並在調用堆棧中查找發件人。 Windows中是否有等效模式?在同步模式下運行Windows GUI應用程序?
0
A
回答
1
AFAIK沒有內置的能力來做到這一點。
但我們先來調查一下這個問題。你想知道誰是消息的發件人。但是你應該知道,窗口消息處理可以通過以下指標分析可分爲:
- 發佈VS發郵件(
PostMessage
VSSendMessage
)。 - 發送到屬於另一個線程vs發送者線程的窗口的消息。
- 發佈到某個線程(未綁定到特定窗口,因此未被窗口過程處理)的消息。
可在跟蹤直接僅當該消息是發送(未貼)發送到一個窗口,而該呼叫到SendMessage
(或類似的)中,以該窗口所屬的線程發出。在這樣的情況下,您會在調用堆棧中看到發件人。
如果消息是從另一個線程發送的 - 您將而不是在調用堆棧中看到它。只是因爲調用堆棧只顯示屬於當前線程的調用鏈。當從另一個線程發送消息時,系統執行以下操作:
- 暫停調用者線程。
- 將此消息放入擁有該窗口的線程隊列中。
- 當該線程調用
GetMessage
(或類似的) - 消息被分派到窗口。 - 最後操作系統恢復調用者線程。
SendMessage
返回窗口過程返回的結果。
在這種情況下,您可能會嘗試間接識別來電者。用斷點中斷程序,並嘗試搜索掛起的線程,這些線程在致電SendMessage
或類似程序時被阻止。
最後,發佈的消息不可能通過上述方法進行跟蹤。您可以嘗試在對PostMessage
的呼叫中添加條件斷點,但如果呼叫者屬於另一個問題 - 這將更加複雜。
0
valdo是正確的。調用SendMessage直接調用你的應用程序wndproc。對PostMessage的調用將消息發送到消息隊列,然後您的應用程序通過消息泵(循環,getmessage,translatemessage,dispatchmessage)來接收消息。所以,就像他所說的,如果消息是通過SendMessage發送的,那麼函數的被調用者將顯示在調用堆棧中。如果它是通過PostMessage發送的,它不會。
相關問題
- 1. 在Windows服務模式下運行GUI應用程序
- 2. 如何在全屏模式下運行Windows Mobile應用程序?
- 3. 應用程序在uwsgi線程模式下運行緩慢
- 4. 是否可以在Windows容器中運行GUI應用程序?
- 5. 如何在windows vm上運行gui應用程序?
- 6. 在1.9模式下使用Jruby運行rails應用程序?
- 7. 在android中開發應用程序在Kiosk模式下運行
- 8. 在調試模式下將windows服務作爲獨立應用程序運行
- 9. C#:在調試模式下運行應用程序
- 10. 如何在emacs-haskell模式下運行haskell應用程序?
- 11. 應用程序未在睡眠模式下運行?
- 12. 如何在後臺模式下仍然運行應用程序?
- 13. 僅在橫向模式下運行應用程序?
- 14. 在生產模式下運行Rails應用程序時出錯
- 15. 如何在powersave模式下運行android應用程序
- 16. 應用程序僅在調試模式下運行
- 17. 僅在調試模式下運行的Android應用程序
- 18. 在深度睡眠模式下運行應用程序/服務?
- 19. PhoneGap在橫向模式下運行應用程序
- 20. 如何在生產模式下運行react-native應用程序?
- 21. 應用程序不能在後臺模式下運行ios
- 22. 無法在沙箱模式下運行Saber Red應用程序
- 23. 在背景模式下運行離子應用程序
- 24. 在無頭模式下運行android應用程序
- 25. 檢測應用程序是否在開發模式下運行
- 26. 如何應用程序在全屏模式下運行android
- 27. 如何永遠在後臺模式下運行應用程序?
- 28. 在Kiosk模式下運行GTK#應用程序
- 29. 如何在無頭模式下運行惡夢應用程序?
- 30. 如何在64位模式下運行應用程序池?
那麼沒有辦法讓PostMessage的行爲像SendMessage?如果是這樣,我看到的唯一方法是暫時用SendMessage替換所有PostMessage調用。 – ks1322 2011-05-31 09:31:23
不,沒有辦法使Postmessage像sendmessage一樣行事,post消息是異步的,並且將消息發送給消息隊列,正如我所說的,發送消息直接繞過消息隊列並直接調用應用程序wndproc。當你調用PostMessage時,它會立即返回,但在調用線程上發送消息塊,因爲它通過調用傳遞給它的hwnd的wndproc來訪問wndproc。 – johnathon 2011-05-31 09:39:46
對於單線程的情況,這個答案是正確的。 'SendMessage'在不同的線程中工作方式不同,因爲您必須在其線程上調用窗口的WindowProc,而不是您自己的。由於每個線程都有自己的調用堆棧,因此您的SendMessage調用將不會與WndProc調用位於同一個堆棧中。 – MSalters 2011-05-31 12:03:40