我正在尝试在Linux中使用IcorProfiler API(使用clang ++编译)来分析.NET核心应用程序。在这里,我尝试将模块名称打印到文件中,该文件使用WCHAR wszName [300]变量中的GetModuleInfo2()填充。
ModuleID moduleID;
LPCBYTE pbBaseLoadAddr;
WCHAR wszName[300];
ULONG cchNameIn = _countof(wszName);
ULONG cchNameOut;
AssemblyID assemblyID;
DWORD pdwModuleFlags = 0;
GetModuleInfo2(moduleID, &pbBaseLoadAddr, cchNameIn, &cchNameOut, wszName, &assemblyID, &pdwModuleFlags);
Trial1:执行GetModuleInfo2()之后,将参数值打印到文件中,如下所示。
FILE * pFile;
pFile = fopen ("/tmp/myfile.txt","a");
fwprintf (pFile, L"wszName: %ls \n",wszName);
fclose (pFile);
文件中的打印输出如下。
wszName: ?????????????????????????????????????
wszName: ???????????????????????????????????l??
wszName: ??????????????????????????????????????????????????l????
Trial2:
wofstream of;
char threadid[64];
sprintf(threadid,"/tmp/module-%d.txt",getpid());
of.open(threadid,std::ios::in | std::ios::binary | std::ios::app);
of<< "After MODULENAME:" << wszName << " " <<
"cchNameIn:" << cchNameIn <<" " <<
"cchNameOut:"<< cchNameOut << " " <<"pbBaseLoadAddr:" << pbBaseLoadAddr << " " <<
"pdwModuleFlags:" << pdwModuleFlags << " " << "assemblyID:" << assemblyID << std::endl;
of.close();
文件中的打印输出如下。
在MODULENAME:0x7ffe35f07010 cchNameIn:300 cchNameOut:2557930008 pbBaseLoadAddr:0x1 pdwModuleFlags:0assemblyID:140525290184540之前
在MODULENAME:0x7ffe35f07010 cchNameIn:300 cchNameOut:80 pbBaseLoadAddr:0x7fce97e40000 pdwModuleFlags:1 assemblyID:31169008]之后>
使用fwprintf()将WCHAR []写入文件正在打印问号,并使用wofstream进行写入在Linux中打印其地址。
这是从IcorProfiler API获取模块名称的正确方法吗?如果是,如何将模块名称(wszname)打印到文件中?
我正在尝试在Linux中使用IcorProfiler API(使用clang ++编译)来分析.NET核心应用程序。在这里,我尝试将模块名称打印到文件中,该文件使用WCHAR中的GetModuleInfo2()填充...
我会用https://en.cppreference.com/w/c/string/multibyte/wcstombs(wcstombs_s)首先将其转换为字符,然后以通常使用的任何方式写入文件]