centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试) (2)

上图种gcroot有3个结果。
第一个,用DumpArray查看后发现,应该是一个系统的静态对象,里面存储都是context之类的东西。
第二个,就是我们的问题list对象。即List<byte[]>
第三个,是第二个list对象的items。
所以问题就出在我们这个静态的 list对象上了,那从代码上搜索一下就比较容易发现我们的List<byte[]>在哪里了。

疑问一

centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)


上图种是书籍Pro .Net Performance: Optimize Your C# Applications第98页的一个列子,可惜没有搞懂他的这个地址怎么出来的,能直接拉出来堆栈信息...

疑问二

按理来说1M应该等于1048576,那为什么这里显示是1048600呢,多余的24byte是啥玩意呢?
dumpobj查看byte[]对象信息
dumpmt查看byte[]类型的mt信息
x addr(对象地址,x命令是lldb的命令,用户查看地址处的内存数据。可以使用 -c 24指定需要查看多少位数据)

centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)


x addr 前16位数据小红框标记,最后8位小红框标记。中间的则是1M的01。01:byte数据,代码直接赋值。

for (int i = 0; i < 100; i++) { var x = new byte[size_1m]; for (int j = 0; j < x.Length; j++) x[j] = 1; env.memory.Add(x); }

centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)


centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)


但是这24位数据内存结构为何这么组织,以及具体的含义就不是特别清楚了,有待考证!!!
学艺不精!,准备回家看看C#本质论有没有说到这部分内容...或者哪位大哥可以说清楚一下,不胜感激!!!
google搜索的时候发现 Pro .Net Performance: Optimize Your C# Applications,这本书很屌啊!!!,绝壁值得一看,就是英文不行,求中文版啊!!!,好想吐槽一下国内的垃圾编辑或作者,好的书一本都不翻译,垃圾玩意全翻译过来。

centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)


https://stackoverflow.com/questions/38056513/why-does-windbg-show-system-int32-variables-as-24-bytes

centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)

死循环调试分析

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfxyd.html