编译了几个.dll使用visual studio 2015,并试图部署在一些旧的Windows 7/64位上.试图猜测应用程序启动和复制MSVCP140.DLL和VCRUNTIME140.DLL需要哪些dll - 但是应用程序无法加载vs2015 dll.开始分析什么是错误的 - 依赖者walker显示来自dll的依赖:
API-MS-WIN-CRT-MATH-L1-1-0.DLL
API-MS-WIN-CRT-HEAP-L1-1-0.DLL
API-MS-WIN-CRT-CONVERT-L1-1-0.DLL
API-MS-WIN-CRT-STRING-L1-1-0.DLL
API-MS-WIN-CRT-STDIO-L1-1-0.DLL
API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
API-MS-WIN-CRT-FILESYSTEM-L1-1-0.DLL
API-MS-WIN-CRT-TIME-L1-1-0.DLL
Run Code Online (Sandbox Code Playgroud)
这是特别令人惊讶的,因为我最好的理解CRT负责启动dll/exe,它不提供任何更高级别的服务.
好的,试图弄清楚如何摆脱它们或至少最小化.
找到一篇文章:https: //blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/
它提到了发布静态库 - 所以我认为我可以链接它们并摆脱*L1-1-0.DLL*依赖地狱,但无论我尝试过什么 - 我都没有成功.我试图链接libvcruntime.lib,libucrt.lib,libcmt.lib,尝试禁用链接器选项"/nodefaultlib:vcruntime.lib",甚至尝试添加include目录$(UniversalCRT_IncludePath),并覆盖一些定义的,因为我试图猜测它们是有效的 - 我的尝试都没有帮助.
作为一个中间解决方案,我回归到使用Visual Studio 2013,其中CRT dll只有两个:msvcp120.dll,msvcr120.dll.
当然,您可能会建议安装Visual Studio 2015运行时,但我们的要求之一是支持独立可执行文件 - 无需任何安装即可运行 - 因此现在无法进行额外安装.
除了等待Visual Studio 2017到货之外,你能推荐我吗?
像大多数人一样,你可能知道存在很多不同的机制来从堆栈跟踪开始,从windows api开始,并继续深入神奇的汇编世界 - 让我列举一些我已经研究过的链接.
总之,让我提一下,我想要有混合模式(托管和非托管)/ 64位+ AnyCPU应用程序的内存泄漏分析机制,并且从所有windows api的CaptureStackBackTrace最适合我的需求,但正如我所分析的 - 它不支持托管代码堆栈行走.但是该函数API最接近我所需要的(因为它还计算回跟踪散列 - 特定调用堆栈的唯一标识符).
我已经排除了查找内存泄漏的不同方法 - 我尝试过的大多数软件要么崩溃要么不能正常工作,要么产生不好的结果.
此外,我不想重新编译现有的软件并覆盖malloc/new其他机制 - 因为它是一项繁重的任务(我们拥有大量代码库和大量的dll).此外,我怀疑这不是我需要执行的一次性工作 - 问题以1 - 2年周期回归,具体取决于谁和编码,所以我更希望在应用程序本身内置内存泄漏检测(内存) api挂钩)而不是一遍又一遍地解决这个问题.
http://www.codeproject.com/Articles/11132/Walking-the-callstack
使用StackWalk64 Windows API函数,但不能与托管代码一起使用.此外64位支持还不完全清楚 - 我已经看到64位问题的一些解决方法 - 我怀疑当在同一线程内完成堆栈遍历时,此代码不能完全正常工作.
然后存在进程黑客:http: //processhacker.sourceforge.net/
其中也使用StackWalk64,但扩展了它的回调函数(第7和第8个参数)以支持混合模式堆栈行走.在使用7/8回调函数进行了大量复杂操作之后,我还成功地获得了支持混合模式支持的StackWalk64(将堆栈跟踪作为向量捕获 - 其中每个指针指向调用过去的汇编/ dll位置).但正如您可能猜到的那样 - StackWalk64的性能不足以满足我的需求 - 即使使用C#端的简单消息框,应用程序只需"挂起"一段时间直到它正确启动.
我没有看到CaptureStackBackTrace函数调用的这么大的延迟,所以我认为StackWalk64的性能不足以满足我的需求.
还存在基于COM的堆栈跟踪确定方法 - 如下所示:http: //www.codeproject.com/Articles/371137/A-Mixed-Mode-Stackwalk-with-the-IDebugClient-Inter
http://blog.steveniemitz.com/building-a-mixed-mode-stack-walker-part-1/
但是我害怕 - 它需要COM,并且线程需要进行初始化,并且由于内存api挂钩我不应该触摸任何线程中的com状态,因为它可能导致更严重的问题(例如,不正确的公寓初始化,其他毛刺)
现在我已经达到了Windows API不能满足我自己需求的程度,我需要手动遍历调用堆栈.例如,可以找到这样的例子:
http://www.codeproject.com/Articles/11221/Easy-Detection-of-Memory-Leaks 请参阅函数FillStackInfo/32位,不支持托管代码.
有几个关于反转堆栈跟踪的提及 - 例如在以下链接上:
特别是1,3,4个链接提供了一些有趣的夜间阅读.:-)
但即便如此,它们也是相当有趣的机制,其中任何一个都没有完全可用的演示示例.
我想其中一个例子是Wine的dbghelp实现(用于linux的Windows"模拟器"),它也显示了StackWalk64最终的工作原理,但我怀疑它与DWARF2文件格式的可执行文件有很大关系,因此它与当前的Windows PE不完全相同可执行文件格式.
有人可以指点我很好地实现堆栈行走,在64位架构上工作,支持混合模式(可以跟踪本机和托管内存分配),这完全是在寄存器/调用堆栈/代码分析中绑定的.(1,3,4的组合实施)
有人与Microsoft开发团队有任何良好的联系,他们可能会回答这个问题吗?
这是我前一个问题的延续 - 第二阶段就是这样说的.
第一个问题是:在Windows/64位/混合模式下快速捕获堆栈跟踪
现在我已经解决了大量的堆栈跟踪,现在想知道如何解析托管堆栈帧的符号信息.
对于原生C++方面,它相对简单 -
首先,您指定从哪里获取符号的过程:
HANDLE g_hProcess = GetCurrentProcess();
Run Code Online (Sandbox Code Playgroud)
您可以使用代码snipet在运行时替换进程,如下所示:
g_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_processId);
b = (g_hProcess != NULL );
if( !b )
errInfo.AppendFormat(_T("Process id '%08X' is not running anymore."), g_processId );
else
InitSymbolLoad();
Run Code Online (Sandbox Code Playgroud)
并初始化符号加载:
void InitSymbolLoad()
{
SymInitialize(g_hProcess, NULL, TRUE);
DWORD dwFlags = SymGetOptions();
SymSetOptions(SymGetOptions() | SYMOPT_DEFERRED_LOADS | SYMOPT_NO_IMAGE_SEARCH);
}
Run Code Online (Sandbox Code Playgroud)
然后解决原生符号,不知何故这样:
extern HANDLE g_hProcess;
void StackFrame::Resolve()
{
struct {
union
{
SYMBOL_INFO symbol;
char buf[sizeof(SYMBOL_INFO) + 1024];
}u;
}ImageSymbol = { 0 };
HANDLE …Run Code Online (Sandbox Code Playgroud) 我正在尝试购买iptv设备,当然,不同的iptv设备支持不同类型的文件格式,视频编解码器和音频编解码器。
有人可以推荐我一些视频集,这些视频集将使用不同的版本以及不同的视频和音频编解码器进行编码-尽可能采用不同的组合。
我知道支持所有内容(所有视频和所有音频编解码器)几乎是不可能的-因此,如果将它们按使用最多的顺序(使用最少的顺序)进行排序会很好。例如:
但是,当然要使用哪种编解码器,在哪里使用取决于您从哪里获得哪部电影。我可以自己订购视频。
最好使视频尽可能小-例如每个剪辑20秒,以及一些您可以轻松检查的视频/音频-可以理解的视频/音频。(语言无所谓)
我还怀疑这种集合不存在-那么可以在这里给我提供不同编解码器的视频剪辑,然后将它们收集到一个集合中。
最终,我想将所有这些片段都放在USB记忆棒上-逛街,尝试一下哪些片段可以播放以及在哪个iptv设备上播放。
在我们自己的软件中,我们支持加载不同类型的图像,包括但不限于.bmp、.gif、.tiff、.jpg 和.png。
在代码中,我注意到某些图像可能正在使用颜色索引,但看起来我们的图像处理库之一缺少一些补丁(曾经丢失过)。
我想针对这种奇怪的图像格式测试我们的软件(我们正在加载 .png 和 .jpg 好吧),您能给我推荐一些图像集,我可以在其中下载许多具有不同保存选项的不同图像文件格式。
因此至少会包含颜色索引的 .png / .tiff / .bmp。
mixed-mode ×2
stack-trace ×2
windows ×2
audio ×1
c++ ×1
codec ×1
file-format ×1
image ×1
iptv ×1
memory-leaks ×1
msvcrt ×1
video ×1