2008-11-07 12 views
7

Oto coś, co wiem, jest prawdopodobnie możliwe, ale nigdy nie udało mi się zrobić
W VS2005 (C++), Podczas debugowania, aby móc wywołać funkcję z kodu, który debuguję.
Ta funkcja jest czasami niezbędna podczas debugowania złożonych struktur danych, których nie można łatwo zbadać przy użyciu zwykłych możliwości okna zegarka.
Okno podglądu wydaje się pozwalać na pisanie wywołań funkcji, ale za każdym razem, gdy go wypróbowuję, daje mi jeden błąd lub inny.wywoływanie funkcji podczas debugowania w programie Visual Studio 2005?

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

Czy ktoś kiedykolwiek uda się czyni tę pracę prawidłowo? Czego mi tu brakuje?

Edit. wyraźnie, funkcja o nazwie powinien być symbolem, który istnieje w bieżącym zakresie debugger jest w

Odpowiedz

10

Ok, oto co znalazłem
CXX0040 oznacza, że ​​"The C expression evaluator does not support implicit conversions involving constructor calls."
CXX0047 oznacza, że ​​"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."

Więc połączeniu oznacza to, że jeśli chcę wywołać funkcję, żaden z argumentów nie powinien mieć niejawnej konwersji i żaden z argumentów nie powinien wymagać konstrukcji.
"niejawna konwersja" w tym kontekście wydaje się zawierać trywialne rzeczy, takie jak konwersja 'String' na 'const String&'.
"Budowa" zdaje się zawierać banalną konstrukcję kopii. więc przekazywanie wartości cokolwiek, co nie jest typem pierwotnym, spowoduje błąd.

To zasadniczo pozostawia funkcje, które pobierają tylko prymitywne typy lub wskaźniki.
Właśnie przetestowałem tę teorię.

Jeśli chcesz wywołać metodę z okna podglądu, dodaj przeciążenie, które pobiera tylko wskaźniki i prymitywy, a następnie w oknie podglądu odpowiednio przekazuj argumenty. Aby przekazać obiekt, który nie jest prymitywnym przekazać jego adres.

+0

Przyszedłem tutaj w poszukiwaniu sposobu wywoływania określonej funkcji w VS na czas debugowania * (btw, pracuję z C#) *, trudno było znaleźć, więc zostawię komentarz tutaj: * * Jak wywołać funkcję w debugerze Visual Studio **: otwórz «Debuguj → Okno → Natychmiastowe» i po prostu napisz w okienku "Natychmiastowe" funkcję do oceny. –

0

Okno zegarek jest ograniczony przez kontekst, w którym aktualna kod jest np kiedy wasz kod wchodzi do funkcji i próbujesz uzyskać dostęp do innej funkcji, która jest ukryta przed zasięgiem twojej obecnej funkcji, nie zadziała.

Jeśli wywołujesz funkcję w oknie podglądu, upewnij się, że jest widoczna i dostępna z bieżącego zakresu.

+0

To nie jest problem. każda funkcja, którą próbuję wywołać, jest widoczna z bieżącego punktu kodowania. – shoosh

+0

Proszę określić ten fakt na swoim pytaniu. Powinienem był wyjaśnić, zamiast odpowiedzieć, widocznie. –

0

Według mojej wiedzy nie można wykonać kodu z okna Watch podczas debugowania niezarządzanego C++. To działa dla C# (i prawdopodobnie VB.NET i zarządzane C++, ale nie jestem na to pozytywny). Prawdopodobnie pozwala na to, ponieważ działa dla niektórych języków, ale nie dla innych.

+2

Czy sprawiłoby to ból, gdyby komunikat o błędzie powiedział coś w stylu "przepraszam, działa tylko w przypadku kodu zarządzanego?". uh. – shoosh

0

Uważamy, że działa to w bardzo dobry sposób. Działają bardzo proste funkcje (w tym funkcje składowe), zazwyczaj proste funkcje pobierania właściwości. Inne bardziej złożone funkcje nie działają i powodują błąd.

Nigdy nie byłem w stanie dostrzec precyzyjne zasady ...

0

nie testowałem, ale zawsze myślałem, że to, co było do natychmiastowego okno (kod wykonującego)

Cameron

0

to jest okno „Natychmiastowe”, że chcesz. A jesteś ograniczony do tego, co widać z miejsca, w którym znajduje się twój aktualny punkt przerwania. Zmienne lokalne i funkcje tej klasy (lub globalne)

0

Z mojego doświadczenia wynika, że ​​niektóre niedociągnięcia występują w bezpośrednim oknie. Nie można wywoływać funkcji członków klas, jeśli klasy pochodzą z innej biblioteki DLL, ale otrzymują błędne komunikaty o błędach. Jeśli cokolwiek jest w tej samej bibliotece DLL (na przykład statycznie łącząc wszystkie inne rzeczy), członkowie wywołujący są dość wiarygodni. Ale skomplikowane rzeczy mogą, ale nie muszą działać, jak wspominają inni.

Powiązane problemy