2008-11-07 125 views
7

這是我知道的東西可能是可能的但我從來沒有設法做
在VS2005(C++),在調試時,能夠從我正在調試的代碼調用一個函數。
調試使用監視窗口的常規功能無法輕鬆探索的複雜數據結構時,此功能有時非常重要。
監視窗口似乎允許編寫函數調用,但每次嘗試時都會給我一個錯誤或另一個錯誤。在使用Visual Studio 2005進行調試時調用函數?

Error: symbol "func" not found
Error: argument list does not match function
Error: member function not present

有沒有人在使這項工作取得成功正確? 我在這裏錯過了什麼?

編輯:清楚,叫應該是存在於當前範圍的調試器是一個符號功能

回答

10

好吧,這裏是我的發現
CXX0040意味着「The C expression evaluator does not support implicit conversions involving constructor calls.
CXX0047意味着「Overloaded functions can be called only if there is an exact parameter match or a match that does not require the construction of an object.

所以合併這意味着如果我想調用一個函數,則任何參數都不應該有隱式轉換,也不應該有任何參數需要構造。
在這種情況下,「隱式轉換」似乎包含一些簡單的事情,如將'String'轉換爲'const String&'
「建設」似乎包括微不足道的複製建設。所以按值傳遞任何不是基本類型的東西都會導致錯誤。

所以這基本上只留下只帶有原始類型或指針的函數。
我剛剛成功測試了這個理論。

所以,如果你想能夠從監視窗口調用一個方法,添加一個只接受指針和原語的重載,並在監視窗口中適當地傳遞參數。傳遞非基元的對象傳遞其地址。

0

監視窗口由上下文,其中當前的代碼,例如有限的,當你的代碼輸入一個函數,並且你嘗試訪問另一個隱藏在當前函數範圍內的函數,它將不起作用。

如果您在監視窗口中調用函數,請確保它在當前範圍內可見且可訪問。

+0

這不是問題。我嘗試調用的任何函數都可以從當前的代碼點看到。 – shoosh 2008-11-07 02:23:45

+0

然後在你的問題中指定這個事實。顯然,我應該澄清而不是回答。 – 2008-11-07 02:25:50

0

據我所知,在調試非託管C++時,無法從Watch窗口執行代碼。這對C#有用(可能還有VB.NET和託管C++,但我對此並不積極)。它很可能允許它,因爲它適用於某些語言,但不適用於其他語言。

+2

那會不會令人傷心,那麼錯誤信息會說「對不起,只適用於託管代碼?」。呃。 – shoosh 2008-11-07 02:25:02

0

我們發現這個作品以非常熱門的方式進行。一些非常簡單的函數(包括成員函數)可以工作,通常是簡單的屬性獲取器。其他更復雜的功能不起作用並出現錯誤。

我從來沒有能夠辨別精確的規則...

0

我沒有測試過這一點,但我一直以爲那是什麼立即窗口是爲(執行代碼)

卡梅倫

0

這是你想要的「立即」窗口。而且你僅限於從當前斷點處可見的內容。局部變量以及該類別上的函數(或全局變量)

0

以我的經驗,即時窗口存在一些缺點。如果類來自不同的DLL,但不能調用類的成員函數,但會獲得誤導性的錯誤消息。如果任何東西在同一個DLL中(例如通過靜態鏈接所有其他東西),調用成員是相當可靠的。正如其他人所說的那樣,複雜的東西可能工作也可能不工作。

相關問題