enh/TD-21425/windows print trace (#19258)
* enh/TD-21425/windows print trace * enh/windows trace test * fix/check calloc failed * enh/windows print,stack size hard code
This commit is contained in:
parent
2673b6a536
commit
e93863a652
|
@ -22,12 +22,16 @@ extern "C" {
|
||||||
|
|
||||||
// If the error is in a third-party library, place this header file under the third-party library header file.
|
// If the error is in a third-party library, place this header file under the third-party library header file.
|
||||||
// When you want to use this feature, you should find or add the same function in the following sectio
|
// When you want to use this feature, you should find or add the same function in the following sectio
|
||||||
|
#if !defined(WINDOWS)
|
||||||
|
|
||||||
#ifndef ALLOW_FORBID_FUNC
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
#define malloc MALLOC_FUNC_TAOS_FORBID
|
#define malloc MALLOC_FUNC_TAOS_FORBID
|
||||||
#define calloc CALLOC_FUNC_TAOS_FORBID
|
#define calloc CALLOC_FUNC_TAOS_FORBID
|
||||||
#define realloc REALLOC_FUNC_TAOS_FORBID
|
#define realloc REALLOC_FUNC_TAOS_FORBID
|
||||||
#define free FREE_FUNC_TAOS_FORBID
|
#define free FREE_FUNC_TAOS_FORBID
|
||||||
#endif
|
#endif // ifndef ALLOW_FORBID_FUNC
|
||||||
|
|
||||||
|
#endif // if !defined(WINDOWS)
|
||||||
|
|
||||||
void *taosMemoryMalloc(int64_t size);
|
void *taosMemoryMalloc(int64_t size);
|
||||||
void *taosMemoryCalloc(int64_t num, int64_t size);
|
void *taosMemoryCalloc(int64_t num, int64_t size);
|
||||||
|
|
|
@ -62,11 +62,38 @@ void taosResetTerminalMode();
|
||||||
taosMemoryFree(strings); \
|
taosMemoryFree(strings); \
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
#include <windows.h>
|
||||||
|
#include <dbghelp.h>
|
||||||
|
|
||||||
|
#define STACKSIZE 64
|
||||||
#define taosPrintTrace(flags, level, dflag) \
|
#define taosPrintTrace(flags, level, dflag) \
|
||||||
{ \
|
{ \
|
||||||
taosPrintLog(flags, level, dflag, \
|
unsigned int i; \
|
||||||
"backtrace not implemented on windows, so detailed stack information cannot be printed"); \
|
void* stack[STACKSIZE]; \
|
||||||
}
|
unsigned short frames; \
|
||||||
|
SYMBOL_INFO* symbol; \
|
||||||
|
HANDLE process; \
|
||||||
|
\
|
||||||
|
process = GetCurrentProcess(); \
|
||||||
|
\
|
||||||
|
SymInitialize(process, NULL, TRUE); \
|
||||||
|
\
|
||||||
|
frames = CaptureStackBackTrace(0, STACKSIZE, stack, NULL); \
|
||||||
|
symbol = (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1); \
|
||||||
|
if (symbol != NULL) { \
|
||||||
|
symbol->MaxNameLen = 255; \
|
||||||
|
symbol->SizeOfStruct = sizeof(SYMBOL_INFO); \
|
||||||
|
\
|
||||||
|
if (frames > 0) { \
|
||||||
|
taosPrintLog(flags, level, dflag, "obtained %d stack frames", frames); \
|
||||||
|
for (i = 0; i < frames; i++) { \
|
||||||
|
SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); \
|
||||||
|
taosPrintLog(flags, level, dflag, "frame:%i: %s - 0x%0X", frames - i - 1, symbol->Name, symbol->Address); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
free(symbol); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -41,7 +41,7 @@ target_link_libraries(
|
||||||
)
|
)
|
||||||
if(TD_WINDOWS)
|
if(TD_WINDOWS)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
os PUBLIC ws2_32 iconv msvcregex wcwidth winmm crashdump
|
os PUBLIC ws2_32 iconv msvcregex wcwidth winmm crashdump dbghelp
|
||||||
)
|
)
|
||||||
elseif(TD_DARWIN_64)
|
elseif(TD_DARWIN_64)
|
||||||
find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
|
find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8...3.20)
|
||||||
|
PROJECT(TDengine)
|
||||||
|
|
||||||
|
FIND_PATH(HEADER_GTEST_INCLUDE_DIR gtest.h /usr/include/gtest /usr/local/include/gtest)
|
||||||
|
FIND_LIBRARY(LIB_GTEST_STATIC_DIR libgtest.a /usr/lib/ /usr/local/lib /usr/lib64)
|
||||||
|
FIND_LIBRARY(LIB_GTEST_SHARED_DIR libgtest.so /usr/lib/ /usr/local/lib /usr/lib64)
|
||||||
|
|
||||||
|
IF (HEADER_GTEST_INCLUDE_DIR AND (LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
||||||
|
MESSAGE(STATUS "gTest library found, build os test")
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${HEADER_GTEST_INCLUDE_DIR})
|
||||||
|
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||||
|
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/src/util/inc)
|
||||||
|
|
||||||
|
# osTests
|
||||||
|
add_executable(osTests "osTests.cpp")
|
||||||
|
target_link_libraries(osTests os util gtest_main)
|
||||||
|
add_test(
|
||||||
|
NAME osTests
|
||||||
|
COMMAND osTests
|
||||||
|
)
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||||
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||||
|
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
TEST(osTest, osSystem) {
|
||||||
|
const char *flags = "UTL FATAL ";
|
||||||
|
ELogLevel level = DEBUG_FATAL;
|
||||||
|
int32_t dflag = 255; // tsLogEmbedded ? 255 : uDebugFlag
|
||||||
|
taosPrintTrace(flags, level, dflag);
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma GCC diagnostic pop
|
Loading…
Reference in New Issue