Rollback from r3608 to r3606
[public/netxms.git] / src / server / core / debug.cpp
CommitLineData
5039dede
AK
1/*
2** NetXMS - Network Management System
3** Copyright (C) 2003, 2004, 2005, 2006 Victor Kirhenshtein
4**
5** This program is free software; you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation; either version 2 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program; if not, write to the Free Software
17** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18**
19** File: debug.cpp
20**
21**/
22
23#include "nxcore.h"
24
25#ifdef _WIN32
26#include <dbghelp.h>
27#endif
28
29
30//
31// Test mutex state and print to stdout
32//
33
34void DbgTestMutex(MUTEX hMutex, const TCHAR *szName, CONSOLE_CTX pCtx)
35{
36 ConsolePrintf(pCtx, _T(" %s: "), szName);
37 if (MutexLock(hMutex, 100))
38 {
39 ConsolePrintf(pCtx, _T("unlocked\n"));
40 MutexUnlock(hMutex);
41 }
42 else
43 {
44 ConsolePrintf(pCtx, _T("locked\n"));
45 }
46}
47
48
49//
50// Test read/write lock state and print to stdout
51//
52
53void DbgTestRWLock(RWLOCK hLock, const TCHAR *szName, CONSOLE_CTX pCtx)
54{
55 ConsolePrintf(pCtx, _T(" %s: "), szName);
56 if (RWLockWriteLock(hLock, 100))
57 {
58 ConsolePrintf(pCtx, _T("unlocked\n"));
59 RWLockUnlock(hLock);
60 }
61 else
62 {
63 if (RWLockReadLock(hLock, 100))
64 {
65 ConsolePrintf(pCtx, _T("locked for reading\n"));
66 RWLockUnlock(hLock);
67 }
68 else
69 {
70 ConsolePrintf(pCtx, _T("locked for writing\n"));
71 }
72 }
73}
74
75
76//
77// Print message to console, either local or remote
78//
79
80void ConsolePrintf(CONSOLE_CTX pCtx, const char *pszFormat, ...)
81{
82 va_list args;
83
84 va_start(args, pszFormat);
85 if (pCtx->hSocket == -1)
86 {
87 vprintf(pszFormat, args);
88 }
89 else
90 {
91 CSCP_MESSAGE *pRawMsg;
92 TCHAR szBuffer[8192];
93
94 _vsntprintf(szBuffer, 8191, pszFormat, args);
95 szBuffer[8191] = 0;
96 pCtx->pMsg->SetVariable(VID_MESSAGE, szBuffer);
97 pRawMsg = pCtx->pMsg->CreateMessage();
98 SendEx(pCtx->hSocket, pRawMsg, ntohl(pRawMsg->dwSize), 0);
99 free(pRawMsg);
100 }
101 va_end(args);
102}
103
104
105//
106// Show server statistics
107//
108
109void ShowServerStats(CONSOLE_CTX pCtx)
110{
111 DWORD i, dwNumItems;
112
113 RWLockReadLock(g_rwlockNodeIndex, INFINITE);
114 for(i = 0, dwNumItems = 0; i < g_dwNodeAddrIndexSize; i++)
115 dwNumItems += ((Node *)g_pNodeIndexByAddr[i].pObject)->GetItemCount();
116 RWLockUnlock(g_rwlockNodeIndex);
117
118 ConsolePrintf(pCtx, "Total number of objects: %d\n"
119 "Number of monitored nodes: %d\n"
120 "Number of collectable DCIs: %d\n\n",
121 g_dwIdIndexSize, g_dwNodeAddrIndexSize, dwNumItems);
122}
123
124
125//
126// Show queue stats
127//
128
129void ShowQueueStats(CONSOLE_CTX pCtx, Queue *pQueue, const char *pszName)
130{
131 if (pQueue != NULL)
132 ConsolePrintf(pCtx, "%-32s : %d\n", pszName, pQueue->Size());
133}
134
135
136//
137// Write process coredump
138//
139
140#ifdef _WIN32
141
142void DumpProcess(CONSOLE_CTX pCtx)
143{
144 STARTUPINFO si;
145 PROCESS_INFORMATION pi;
146 char cmdLine[64], buffer[256];
147
148 ConsolePrintf(pCtx, "Dumping process to disk...\n");
149
150 sprintf(cmdLine, "netxmsd.exe --dump %d", GetCurrentProcessId());
151 memset(&si, 0, sizeof(STARTUPINFO));
152 si.cb = sizeof(STARTUPINFO);
153 if (CreateProcess(NULL, cmdLine, NULL, NULL, FALSE,
154 (g_dwFlags & AF_DAEMON) ? CREATE_NO_WINDOW : 0, NULL, NULL, &si, &pi))
155 {
156 WaitForSingleObject(pi.hProcess, INFINITE);
157 CloseHandle(pi.hThread);
158 CloseHandle(pi.hProcess);
159
160 ConsolePrintf(pCtx, "Done.\n");
161 }
162 else
163 {
164 ConsolePrintf(pCtx, "Dump error: CreateProcess() failed (%s)\n", GetSystemErrorText(GetLastError(), buffer, 256));
165 }
166}
167
168#else
169
170void DumpProcess(CONSOLE_CTX pCtx)
171{
172 ConsolePrintf(pCtx, "DUMP command is not supported for current operating system\n");
173}
174
175#endif