关于Mysql errno: 22 - Invalid argument Unhandled MySQL errono 1017. Unexpected behaviour possible. 错误

问题出现:

服务端一致报错,根据报错路径搜索 @05f1 也搜索不到。
主要不知道如何复现报错。
在这里插入图片描述

解决问题:

代码通过该链接:Win环境C++堆栈打印
后来到服务端代码找到报错打印位置添加了堆栈打印(代码上网上找到的)经过测试后可以正常打印堆栈信息。

堆栈输出如下,其实这里边信息并没有能指向错误位置,但根据打印信息大致判断到有可能是乱码导致。(最终就是因为乱码导致的)
在这里插入图片描述

以下为自己修改后的Win环境C++堆栈打印
最终调用 func1()到需要打印的位置即可。

MAX_STACK_FRAMES = 12; //这里没有测试最高可以达到多少层的堆栈追踪,按说越高越好。

#include <windows.h>
#include <dbghelp.h>
#include <stdio.h>

#if _MSC_VER
#define snprintf _snprintf
#endif

#define STACK_INFO_LEN  1024


void WriteLogss(char * szLog) //打印日志到txt
{
	SYSTEMTIME st;
	GetLocalTime(&st);
	FILE *fp;
	fp = fopen("./Logs/Err_Log.txt", "at");
	fprintf(fp, "MyLogInfo: %d:%d:%d:%d ", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
	fprintf(fp, szLog);
	fclose(fp);
	OutputDebugStringA(szLog);

}

void ShowTraceStack(char* szBriefInfo)
{
	static const int MAX_STACK_FRAMES = 12;
	void *pStack[MAX_STACK_FRAMES];
	static char szStackInfo[STACK_INFO_LEN * MAX_STACK_FRAMES];
	static char szFrameInfo[STACK_INFO_LEN];

	HANDLE process = GetCurrentProcess();
	SymInitialize(process, NULL, TRUE);
	WORD frames = CaptureStackBackTrace(0, MAX_STACK_FRAMES, pStack, NULL);
	strcpy_s(szStackInfo, szBriefInfo == NULL ? "stack traceback:\n" : szBriefInfo);

	for (WORD i = 0; i < frames; ++i) {
		DWORD64 address = (DWORD64)(pStack[i]);

		DWORD64 displacementSym = 0;
		char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
		PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
		pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
		pSymbol->MaxNameLen = MAX_SYM_NAME;

		DWORD displacementLine = 0;
		IMAGEHLP_LINE64 line;
		line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);

		if (SymFromAddr(process, address, &displacementSym, pSymbol) &&
			SymGetLineFromAddr64(process, address, &displacementLine, &line))
		{
			_snprintf_s(szFrameInfo, sizeof(szFrameInfo), "\t%s() at %s:%d(0x%llx)\n",
				pSymbol->Name, line.FileName, line.LineNumber, pSymbol->Address);
		}
		else
		{
			_snprintf_s(szFrameInfo, sizeof(szFrameInfo), "\terror: %d\n", GetLastError());
		}
		strcat_s(szStackInfo, szFrameInfo);
	}

	printf("%s", szStackInfo); // 输出到控制台,也可以打印到日志文件中

	WriteLogss(szStackInfo);
}

void func2()
{
	bool isError = true;
	if (isError)
	{
		ShowTraceStack("error in func2\n");
	}
	else
	{
		printf("this is func2\n");
	}
}

void func1()
{
	int sum = 0;
	for (int i = 0; i < 100; ++i)
		sum += i;

	func2();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值