我正在尝试在 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);
试用1:
执行 GetModuleInfo2() 后,将参数值打印到文件中,如下所示。
FILE * pFile;
pFile = fopen ("/tmp/myfile.txt","a");
fwprintf (pFile, L"wszName: %ls \n",wszName);
fclose (pFile);
文件中的打印输出如下。
wszName: ?????????????????????????????????????
wszName: ???????????????????????????????????l??
wszName: ??????????????????????????????????????????????????l????
试验2:
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:0 assemblyID:140525290184540 之前
MODULENAME:0x7ffe35f07010 cchNameIn:300 cchNameOut:80 pbBaseLoadAddr:0x7fce97e40000 pdwModuleFlags:1 assemblyID:31169008 之后
使用 fwprintf() 将 WCHAR [ ] 写入文件是打印问号并使用 wofstream 写入在 Linux 中打印其地址。
这是从 IcorProfiler API 获取模块名称的正确方法吗?如果是,我如何将模块名称(wszname)打印到文件中?
最佳答案
我会用
https://en.cppreference.com/w/c/string/multibyte/wcstombs (wcstombs_s) 首先将其转换为字符,然后使用通常用于写入文件的任何方式
char name[300]; // Limitation was used from the question code
size_t convertedChars = 0;
if (wcstombs_s(&convertedChars, name, 300, wszName) != 0)
{
// Error
}
if (convertedChars != cchNameOut)
{
// Error
}
编辑:
在 Linux 中对其进行测试后,似乎 WCHAR 实际上是一个 char16_t(与 windows 不同,它被定义为一个 wchar_t)。关于区别的很好的阅读在这里 https://ducmanhphan.github.io/2018-12-06-How-to-use-char-wchar_t-char16_t-char32_t-right-a-way-in-C++/
将 char16_t 转换为 char 数组有点棘手,因为您必须单独解析每个字符。您可以使用std::c16rtomb .
关于c++ - 如何在Linux中将WCHAR []打印到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59579588/