挖井

类库大魔王的挖井日记

挖一口属于自己的井


遇到件奇怪的事

  今天终于从服务器上找到几个没因为too old而被删掉的core dump文件,于是祭出WinDBG进行分析。
  最大的障碍还是对WinDBG不熟,以及对常用的分析方法不了解。
  不过发现一个奇怪的事情。程序是在Win API里崩溃的,该API接受两个字符串作为参数,所以一般说来我们可以认为是作为参数的字符串有问题。通过call stack终于找到最早的这两个字符串的出生地,是两个std::wstring,被const_cast强行对.c_str()的返回值进行转换然后传递出去。所以说,如果call stack没有问题的话,应该是这std::wstring对象的问题了。因为从dump文件中看到TCHAR*的值确实是指向一个不知道什么地方的地方,反正dd是看不出来的,于是dt -r查看这两个std::wstring对象,发现其中的其中的ptr域确实就是指向不知道什么地方去了。好了,奇怪的事情被我发现了,这个函数里,有两个std::wstring对象占用的是同一个内存地址!一开始我的直觉是这不可能,难道是dump文件的问题,或者是release buiding优化后就读不到正确的内容了?我看了一下代码,发现这两个对象是存在于不同的scope中的,有不同的生命周期,嗯,这是从C++对象模型的角度的说法,但实际上编译器会怎么实现,我是一点都没头绪的。我跟老大说了一下,他也认为是dump文件的问题,然后我打开第二个core dump文件,发现了同样的问题。于是虽然老大仍然坚持他的意见,我已经有点动摇了。
  好奇怪呀呀呀!

本文地址:

https://minidump.info/blog/2011/08/e9-81-87-e5-88-b0-e4-bb-b6-e5-a5-87-e6-80-aa-e7-9a-84-e4-ba-8b/

上一篇

宁缺勿滥

  我虽然真有点心急吧,但宁缺勿滥的原则是深入骨髓的。我不担心没有喜欢的人,也不担心没有喜欢我的人,只是担心没有互相喜欢的人。像我这样的年纪的生活能自理的人,至今仍然单身的,一般都是自己心理上的问题。但对别人介绍对象这事,尤其是那种随意介绍,是个母的就介绍过来,还真感觉很耻辱很伤自尊的。…

Life 全文阅读
下一篇

下决心买几本书

  好吧,才发现文章少了一篇还是两篇,估计是换服务器时没留意,数据没同步过来。  今天跟老大谈了下,老大说希望我以后主要研究下Dr.Watson这玩意,另外再加一两个features吧。哈哈,我正好对WinDBG比较有兴趣,我想如果能用WinDBG达到像用VS里的JIT-debugger的熟练...…

Job 全文阅读