W MFC C++ (Visual Studio 6) Jestem przyzwyczajony do używania makra TRACE do debugowania. Czy istnieje równoważne oświadczenie dla zwykłego win32?Czy istnieje instrukcja TRACE dla podstawowego C32 win32?
Odpowiedz
_RPTn działa świetnie, ale nie tak wygodnie. Here is some code, który odtwarza instrukcję MFC TRACE jako funkcję dopuszczającą zmienną liczbę argumentów. Dodaje również makro TraceEx, które przedkłada plik źródłowy i numer wiersza, dzięki czemu można kliknąć z powrotem na lokalizację instrukcji.
Aktualizacja: Oryginalny kod w CodeGuru nie zostałby skompilowany dla mnie w trybie Release, więc zmieniłem sposób, w jaki instrukcje TRACE są usuwane do trybu Release. Oto moje pełne źródło, które umieściłem w Trace.h. Dzięki Thomas Rizos dla oryginalnego:
// TRACE macro for win32
#ifndef __TRACE_H__850CE873
#define __TRACE_H__850CE873
#include <crtdbg.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#ifdef _DEBUG
#define TRACEMAXSTRING 1024
char szBuffer[TRACEMAXSTRING];
inline void TRACE(const char* format,...)
{
va_list args;
va_start(args,format);
int nBuf;
nBuf = _vsnprintf(szBuffer,
TRACEMAXSTRING,
format,
args);
va_end(args);
_RPT0(_CRT_WARN,szBuffer);
}
#define TRACEF _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \
&strrchr(__FILE__,'\\')[1],__LINE__); \
_RPT0(_CRT_WARN,szBuffer); \
TRACE
#else
// Remove for release mode
#define TRACE ((void)0)
#define TRACEF ((void)0)
#endif
#endif // __TRACE_H__850CE873
Od docs MSDN Macros for Reporting:
Można użyć _RPTn i makra _RPTFn, zdefiniowanego w CRTDBG.H, aby zastąpić użycie printf do debugowania. Te makra automatycznie znikają w kompilacji wydania, gdy _DEBUG nie jest zdefiniowany, więc nie ma potrzeby zamykania ich w #ifdefs.
Istnieje również OutputDebugString. Jednak nie zostanie to usunięte podczas kompilowania wydania.
makra śladowe że dostarczenie wiadomości z źródłowego Widżet, run-time callstack informacyjnego i prototyp funkcja informacje o wartościach parametrów:
Okazało się, że za pomocą _RPT()
makro będzie również działać z plikiem źródłowym C w Visual Studio 2005. Ten artykuł Debugging with Visual Studio 2005/2008: Logging and Tracing zawiera przegląd TRACE, _RPT i innego rodzaju rejestrowania makra.
wygenerować linię do pliku dziennika o nazwie ASSRTLOG który zawiera dzienniki i pisząc dziennik do pliku, ja też zrobić następującą linię kodu źródłowego:
_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1);
Linia ta stawia ten sam dziennik, który przechodzi do pliku dziennika w oknie wyjściowym IDE Visual Studio 2005.
Może zainteresuje Cię mechanika stojąca za podejściem, którego używamy do rejestrowania. Mamy funkcję PifLogAbort()
, która przyjmuje serię argumentów, które są następnie wykorzystywane do generowania dziennika. Te argumenty zawierają nazwę pliku, w którym generowany jest dziennik wraz z numerem wiersza.Makro wygląda następująco:
#define NHPOS_ASSERT_TEXT(x, txt) if (!(x)) { PifLogAbort((UCHAR *) #x , (UCHAR *) __FILE__ , (UCHAR *) txt , __LINE__);}
i prototyp funkcji dla PifLogAbort()
wyglądać następująco:
PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo)
i wykorzystać makro będziemy wstawić linię:
NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn(): EtkTimeIn() returned error");
To, co zrobi to makro, to to, że jeśli kod powrotu jest mniejszy niż 0 (asercja nie powiedzie się), zostanie wygenerowany dziennik z dostarczonym tekstem. Dziennik zawiera warunek, który wygenerował dziennik wraz z nazwą pliku i numerem linii.
Funkcja PifLogAbort()
generuje logi o określonej długości i traktuje plik wyjściowy jako bufor cykliczny. Dzienniki mają również znacznik czasu i daty.
W tych przypadkach, w których chcemy wygenerować tekst opisowy dynamicznie w czasie wykonywania, może zapewnić rzeczywistą wartość kodu błędu, możemy skorzystać z funkcji sprintf() z buforem jak w poniższej sekwencji kodu:
if (sErrorSave != STUB_BM_DOWN) {
char xBuff[128];
sprintf(xBuff, "CstSendBMasterFH: CstComReadStatus() - 0x%x, sError = %d", usCstComReadStatus, CliMsg.sError);
NHPOS_ASSERT_TEXT((sErrorSave == STUB_BM_DOWN), xBuff);
}
Jeśli chcemy, aby dzienniki nie były generowane, musimy tylko przejść do pojedynczego pliku nagłówkowego, w którym zdefiniowane jest makro i zdefiniować je jako nic, a następnie przekompilować. Jednak stwierdziliśmy, że te dzienniki mogą być bardzo cenne podczas badania problemów w terenie i są szczególnie przydatne podczas testowania integracji.
wystarczy użyć mniej więcej tak (z pamięci, nie testowane na wszystkich ...)
#define TRACE(msg) {\
std::ostringstream ss; \
ss << msg << "\n"; \
OutputDebugString(msg.str()); \
}
I wtedy można pisać takie rzeczy jak: -
TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);
można zawinąć że w niektóre #ifdefs do usunięcia go w wersji łatwo buduje.
Troszkę poprawkę: 'OutputDebugString (ss.str(). C_str());' powinien być użyty zamiast 'OutputDebugString (msg.str());' – Apokal
Windows Events są potencjalnym zamiennikiem dla makr TRACE
, w zależności od konkretnego scenariusza. Kod zostanie wkompilowany w konfiguracje Debug and Release. Śledzenie zdarzeń można dynamicznie włączać i wyłączać, wyświetlać w czasie rzeczywistym lub umieszczać na maszynie klienta w celu późniejszej diagnozy. Ślady można skorelować z informacjami śledzenia uzyskanymi również z innych części systemu operacyjnego.
Jeśli potrzebujesz tylko zrzutu informacji, ilekroć kod dociera do określonych punktów kontrolnych, wraz ze zmienną zawartością, śladami stosu lub nazwami dzwoniących, Visual Studio to Tracepoints jest nieinwazyjną opcją, aby to zrobić.
- 1. Trace Routing dla określonego portu
- 2. Czy istnieje instrukcja blokady w VB.NET?
- 3. Win32: Obejść dla GetFileAttributes()
- 4. cufft.lib dla win32 brakuje
- 5. Dlaczego moja kontrola edycji wygląda dziwnie w mojej aplikacji c32 win32 używając MFC?
- 6. HaxeFlixel Trace
- 7. Czy instrukcja dla ciągów w python?
- 8. Czy istnieje sposób dostępu do podstawowego kontenera adapterów kontenerowych STL?
- 9. Czy istnieje narzędzie do zbierania statystyk użycia aplikacji Win32?
- 10. Czy istnieje odpowiednik "AssemblyInfo.cs" w projekcie Win32 DLL?
- 11. Instrukcja dla LINQ do obiektów
- 12. Czy istnieje sposób na składanie podbloków Zaćmienie, jak instrukcja "Jeśli"?
- 13. Sprawdź, czy istnieje tabela, jeśli instrukcja w C#?
- 14. PL/SQL: czy istnieje instrukcja, aby całkowicie zatrzymać wykonywanie skryptu?
- 15. Czy istnieje instrukcja VB.NET "With" w języku C#?
- 16. Dlaczego istnieje instrukcja REP LODS AL?
- 17. Interfejs API win32 win32 api
- 18. Konwertowanie OCaml na F #: Czy istnieje prosty sposób symulacji najwyższego poziomu OCaml #trace w F #
- 19. Instrukcja instalacji MonoGame dla Mac
- 20. Czy znasz ramy MVC dla aplikacji Win32 Delphi?
- 21. Skrócona instrukcja dla początkujących XSLT
- 22. Actionscript3: Czy zmienna istnieje?
- 23. Karma JSPM Horrible Trace Log
- 24. Trace na konsoli Chrome/przeglądarce
- 25. Czy musimy podać "nie puste" dla klucza podstawowego? Oracle/SQL
- 26. Czy istnieje zamiennik C++ 11 (lub boost) zamiennik dla InterlockedExchangePointer?
- 27. System Android Trace [znaczniki śledzenia]
- 28. Czy istnieje podspec dla Opencv?
- 29. Czy istnieje CMS dla windy?
- 30. Czy istnieje alternatywa dla HTML?
dlaczego ktokolwiek korzysta z Visual Studio 6 w tych dniach. Rok 2005 i teraz 2008 są wolne od długiego czasu. –