32位dll转64位可以直接转成64位的吗

64位windows为什么不把system32改成system64 ?190收藏分享举报文章被以下专栏收录记一些十分基础但又容易被忽视的技术细节推荐阅读{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&记一些十分基础但又容易被忽视的技术细节&,&permission&:&COLUMN_PUBLIC&,&memberId&:92708,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&记一些十分基础但又容易被忽视的技术细节&,&urlToken&:&jilinxiaohuo&,&id&:9883,&imagePath&:&43e82dc6d0adfdcd0760f.jpeg&,&slug&:&jilinxiaohuo&,&applyReason&:&&,&name&:&各种Crash&,&title&:&各种Crash&,&url&:&https:\u002F\\u002Fjilinxiaohuo&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:1845,&avatar&:{&id&:&43e82dc6d0adfdcd0760f&,&template&:&https:\u002F\\u002F{id}_{size}.jpeg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\\u002F43e82dc6d0adfdcd0760f_l.jpeg&,&articlesCount&:21},&state&:&accepted&,&targetPost&:{&titleImage&:&&,&lastUpdated&:,&imagePath&:&&,&permission&:&ARTICLE_PUBLIC&,&topics&:[797,15],&summary&:&无意中发现了这个问题,发一些个人的理解.问题链接在此:\u003Ca href=\&https:\u002F\\u002Fquestion\u002F\& data-editable=\&true\& data-title=\&64位windows为什么不把system32改成system64 ? - Microsoft Windows\& class=\&\&\u003E64位windows为什么不把system32改成system64 ? - Microsoft Windows\u003C\u002Fa\u003E不修改是为了保证兼容性, 因为历史上有无数的呆逼获取这个路径的时候没有用API, 直接硬编码的System32, 为了保证这些烂程序的移植, …&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&all&,&likes&:0,&origAuthorId&:0,&publishedTime&:&T10:02:15+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:1109416,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&64位windows为什么不把system32改成system64 ?&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:9883,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&&,&author&:{&bio&:&low b一个&,&isFollowing&:false,&hash&:&d570a141b59ffe4f079f&,&uid&:32,&isOrg&:false,&slug&:&jilinxiaohuo&,&isFollowed&:false,&description&:&&,&name&:&吉林小伙&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fjilinxiaohuo&,&avatar&:{&id&:&2d64fcfdb33dd6a5bf893cca6179734e&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:92708,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:425888}],&title&:&64位windows为什么不把system32改成system64 ?&,&author&:&jilinxiaohuo&,&content&:&无意中发现了这个问题,发一些个人的理解.问题链接在此:\u003Ca href=\&https:\u002F\\u002Fquestion\u002F\& class=\&internal\&\u003E64位windows为什么不把system32改成system64 ? - Microsoft Windows\u003C\u002Fa\u003E\u003Cblockquote\u003E不修改是为了保证兼容性, 因为历史上有无数的呆逼获取这个路径的时候没有用API, 直接硬编码的System32, 为了保证这些烂程序的移植, 只好保留这个路径名\u003C\u002Fblockquote\u003E\u003Cp\u003E这个是\u003Ca class=\&member_mention\& href=\&http:\u002F\\u002Fpeople\u002Faee55fc6d0d2b1efa72d290\& data-hash=\&aee55fc6d0d2b1efa72d290\& data-hovercard=\&p$b$aee55fc6d0d2b1efa72d290\& data-editable=\&true\& data-title=\&Skogkatt\&\u003ESkogkatt\u003C\u002Fa\u003E老师的回答,给了我启发,但是依然没有解决我的疑惑,我相信也没有解决题主的疑惑.因为微软已经做了重定向操作,会把32位进程对system32的访问重定向到syswow64下,所以就算程序内硬编码了System32,也可以根据进程是32还是64位进行重定向.我举例说明下:\u003C\u002Fp\u003E\u003Cp\u003E假设现在有一行代码内硬编码了C:\\windows\\system32\\xxxx.dll,然后这个代码分别编译成了32位和64位版本,现在启动32位的进程,微软会对此路径进行重定向,重定向到C:\\windows\\syswow64\\xxxx.dll下,如果你启动的是64位进程,那么微软就不会进行重定向了,因为C:\\windows\\system32\\xxxx.dll就是64位的.\u003C\u002Fp\u003E\u003Cp\u003E现在假设微软把64位的dll放到system64内, 32位的dll放到system32内,那会是什么情况呢?那我们先启动一下32位的进程,微软并不会重定向,因为C:\\windows\\system32\\xxxx.dll就是32位的,可以直接访问,那启动64位的进程呢?那微软就需要做重定向,将C:\\windows\\system32\\xxxx.dll重定向到C:\\windows\\system64\\xxxx.dll,这样也是可以的啊.\u003C\u002Fp\u003E\u003Cp\u003E那么问题来了,为什么微软不这么干呢?我想题主应该也是纠结在这,所以我大胆的设想了一下,为了性能!\u003C\u002Fp\u003E\u003Cp\u003E跟踪下重定向操作就可以知道,重定向操作多多少少会影响一点性能的,而在未来的操作系统上,64位进程一定会成为主流,32位进程也会越来越少,所以为了长远打算,微软决定让64位进程不进行重定向,以便提高性能,但是还要兼顾兼容性,只能把64位的dll放到system32里了,你们知道微软在做这个决定的时候有多纠结么?反正我是不知道,我也是猜的.\u003C\u002Fp\u003E\u003Cp\u003E所以现在可以回答题主的问题了,主要是为了性能,其次是为了兼容性,如果仅仅是为了兼容性,是可以按题主的想法进行的.\u003C\u002Fp\u003E\u003Cp\u003E其实这里面还有好多细节,说个好玩的:\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002Fec9f67aa992ac7de7f66_b.png\& data-rawwidth=\&896\& data-rawheight=\&647\& class=\&origin_image zh-lightbox-thumb\& width=\&896\& data-original=\&https:\u002F\\u002Fec9f67aa992ac7de7f66_r.png\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='896'%20height='647'&&\u002Fsvg&\& data-rawwidth=\&896\& data-rawheight=\&647\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&896\& data-original=\&https:\u002F\\u002Fec9f67aa992ac7de7f66_r.png\& data-actualsrc=\&https:\u002F\\u002Fec9f67aa992ac7de7f66_b.png\&\u003E\u003C\u002Ffigure\u003E,你看,dll明明在那里,就是提示找不到.出现这种问题的原因其实就是因为Dependency Walker是32位进程,操作系统对C:\\Windows\\System32\\wow64cpu.dll的访问进行了重定向,重定向到C:\\Windows\\syswow64\\wow64cpu.dll了,而在这个路径下是没有这个文件的, 所以加载这个dll失败了,然后Dependency Walker直接显示找不到文件,而这个路径就是你文件拖进去的那个路径,是不是很奇葩?\u003C\u002Fp\u003E\u003Cp\u003E如果仔细专研下这个东西,还会发现很多有意思的东西,以后再聊.\u003C\u002Fp\u003E\u003Cp\u003EPS:\u003C\u002Fp\u003E\u003Cp\u003E以上都是个人猜想,毕竟我没有参与windows的开发,只能找一种能说服我自己的解释,希望大家踊跃评论,以便我更加接近真相.谢谢大家\u003C\u002Fp\u003E&,&updated&:new Date(&T02:02:15.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:53,&collapsedCount&:0,&likeCount&:190,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Microsoft Windows&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Win7兼容性&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&C \u002F C++&}],&adminClosedComment&:false,&titleImageSize&:{&width&:0,&height&:0},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&jilinxiaohuo&,&name&:&各种Crash&},&tipjarState&:&inactivated&,&annotationAction&:[],&sourceUrl&:&&,&pageCommentsCount&:53,&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T10:02:15+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&软件爱好者&,&isFollowing&:false,&hash&:&eb08b032e277d80f61e058dd95b00180&,&uid&:48,&isOrg&:false,&slug&:&ashfinal&,&isFollowed&:false,&description&:&&,&name&:&ashfinal&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fashfinal&,&avatar&:{&id&:&v2-07fb31eb84b049e2a3b99453&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&&,&isFollowing&:false,&hash&:&64dc24c8dadf336bc472de58e75b58cc&,&uid&:48,&isOrg&:false,&slug&:&hh-oo&,&isFollowed&:false,&description&:&小时候不努力念书,长大只能给人点赞。&,&name&:&hh oo&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fhh-oo&,&avatar&:{&id&:&d041ef9cc&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&理学学士\u002Fintp\u002F转行ing&,&isFollowing&:false,&hash&:&6bae4bda900ffc6e7b1dea&,&uid&:865900,&isOrg&:false,&slug&:&limerick&,&isFollowed&:false,&description&:&&,&name&:&limerick&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Flimerick&,&avatar&:{&id&:&v2-0e4c2f85f460bea39efe369&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&哔哩哔哩 宅男 学生党 Coder&,&isFollowing&:false,&hash&:&bcaba64a0ccc&,&uid&:292500,&isOrg&:false,&slug&:&pan-xue-dong-33&,&isFollowed&:false,&description&:&&,&name&:&Pr0gr4mm3r&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fpan-xue-dong-33&,&avatar&:{&id&:&v2-6bab7ede6ca364a&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&药娘\u002FMTF \u002F蓝票是虚空呢~\u002F卡吧基佬\u002F易爆品\u002F宅技术\u002F图吧垃圾佬\u002F&,&isFollowing&:false,&hash&:&68c4b115f6eac5b78bf2fe8e04ba8d57&,&uid&:232800,&isOrg&:false,&slug&:&yao-niang-wmao-niang&,&isFollowed&:false,&description&:&(\u002F24入坑至今)喵喵喵!!这里图吧垃圾老!求福利各种垃圾OvO! !!!\n\n另外…欢迎加入萌汉子萌♂妹子卖萌群(一个面向大众的伪娘,药娘群。里面也有几个小受,直男!欢迎参观!)\n\n群号码:…里面的群主 喵酱就是我QAQ&,&name&:&喵酱&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fyao-niang-wmao-niang&,&avatar&:{&id&:&v2-58b4962bdaeb0d88a6c8d54e&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&无意中发现了这个问题,发一些个人的理解.问题链接在此:\u003Ca href=\&https:\u002F\\u002Fquestion\u002F\& data-editable=\&true\& data-title=\&64位windows为什么不把system32改成system64 ? - Microsoft Windows\& class=\&\&\u003E64位windows为什么不把system32改成system64 ? - Microsoft Windows\u003C\u002Fa\u003E不修改是为了保证兼容性, 因为历史上有无数的呆逼获取这个路径的时候没有用API, 直接硬编码的System32, 为了保证这些烂程序的移植, …&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&C \u002F C++&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&软件崩溃&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&软件调试&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&low b一个&,&isFollowing&:false,&hash&:&d570a141b59ffe4f079f&,&uid&:32,&isOrg&:false,&slug&:&jilinxiaohuo&,&isFollowed&:false,&description&:&&,&name&:&吉林小伙&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fjilinxiaohuo&,&avatar&:{&id&:&2d64fcfdb33dd6a5bf893cca6179734e&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&jilinxiaohuo&,&name&:&各种Crash&},&content&:&\u003Cb\u003E现象:\u003C\u002Fb\u003E\u003Cp\u003E服务端不定时崩溃,每次崩溃查看调用栈都是std::map里的insert之类的操作,而且崩溃的具体指令不同,崩溃比较频繁,可能一个小时就出多次.\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E分析:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E经过多次崩溃core文件的分析,几乎确定是堆被写坏了,导致在分配或释放内存的时候崩溃.别问我为什么确定是堆被写坏了,这就是优秀男人的直觉.:)\u003C\u002Fp\u003E\u003Cp\u003E这种问题真的没什么好办法(虽然我有N种方法来帮助定位这种问题,但是没有一种方法可以保证效果的,这些方法以后有机会再说),试图从core文件里分析出问题的原因只能靠运气了,然而这次我们的运气并不好,毛都没发现.\u003C\u002Fp\u003E\u003Cp\u003E然后就要利用工具了,我们的服务端程序有windows和linux版本,我比较熟悉windbg,那就用windbg开个full page heap来碰碰运气.结果因为服务端需要大量内存,导致服务器在开启full page heap的情况下根本就运行不起来,分分钟就占用超过3G的内存然后分配失败了.看来用工具是不行了(其实linux下也有类似工具,只不过当时我不知道,所以没尝试),大家就对着svn log翻代码.查看哪些代码呢?当然是最近更新出去的内容了.于是我们把最近更新的功能一一列出,作为重点怀疑对象,这也算是终极解决方案了.\u003C\u002Fp\u003E\u003Cp\u003E然而很不幸的是,我们仔细review了重点怀疑对象相关的代码,都没能发现什么问题.后来一个同事在内部服务器上胡乱测试了一下寄售行的搜索功能,过了一会,服务器竟然崩溃了.我赶紧ssh到服务器上,查看了core文件的调用栈,竟然跟外服的崩溃如出一辙,于是我们赶紧把目标锁定在寄售行上.\u003C\u002Fp\u003E\u003Cp\u003E寄售行这个功能上一个版本已经更新出去了,并且一直运行良好,没有触发崩溃.本次更新也只增加了一点代码:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EItem\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ea\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eb\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E....\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Ebool\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eflag\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&c1\&\u003E\u002F\u002F新增的flag\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EC\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E:\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eflag\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nb\&\u003Efalse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&c1\&\u003E\u002F\u002F新增的flag初始化为false\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E};\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这行代码我们之前review的时候看过好多次,并没有发现什么问题,但是既然内部服务器重现了崩溃,那就要好好看看这行代码到底干了什么了.\u003C\u002Fp\u003E\u003Cp\u003E于是问同事刚才搜索了什么,同事说他随便输入了一个东西,于是我们去寄售行里查看搜索的代码,如果搜索一个东西,会执行如下代码:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003ESendResultToClient\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003En\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E...)\u003C\u002Fspan\u003E\u003Cspan class=\&c1\&\u003E\u002F\u002Fn为搜索到的结果条数\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ep\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Emalloc\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPacket\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003En\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E));\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EPacket\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Epacket\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Enew\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ep\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPacket\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E....\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003ESendToClient\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Epacket\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPacket\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003En\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E));\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\n\n\u003Cspan class=\&c1\&\u003E\u002F\u002FPacket类声明\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EPacket\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ea\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eb\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E....\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ecount\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EItem\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eitems\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E];\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E};\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E聪明的你看出问题了么?\u003C\u002Fp\u003E\u003Cp\u003EC99的扩展支持柔性数组,也就是Item items[0]这样的,但是c++标准并不支持这样长度为0的数组,所以要想在c++里使用这样的功能,就定义一个Item items[1]了,然后在分配的时候这样操作:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kt\&\u003Evoid\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ep\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Emalloc\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPacket\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Esizeof\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003En\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E));\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003EPacket\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Epacket\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Enew\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ep\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPacket\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这样比如搜索结果是10条,那分配了一个Packet + 9个Item这么大的内存,这样恰好能放下10条结果,问题就出在这里,如果搜索到的结果是0条,那分配的内存就是sizeof(Packet) - sizeof(Item)了,因为并没有结果,所以分配的内存里也减去了Packet最后的那个Item items[1],看起来还蛮合理的.并且这条代码在上一个版本并没有出任何问题.\u003C\u002Fp\u003E\u003Cp\u003E但是为什么在这个版本就出问题了呢?因为:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EItem\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ea\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Eint\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eb\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E....\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Ebool\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eflag\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&c1\&\u003E\u002F\u002F新增的flag\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E:\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eflag\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nb\&\u003Efalse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&c1\&\u003E\u002F\u002F新增的flag初始化为false\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E};\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E注意看新增的构造函数,对flag进行了初始化,这样在new(p) Packet执行的时候,Item items[1]就会调用Item的构造函数,然后把flag写成了false,可是并没有分配这个Item的内存啊,所以就越界写了.最后导致崩溃.\u003C\u002Fp\u003E\u003Cp\u003E问题已经水落石出了,最后总结一下:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003Ereview代码一定不要放过本次更新的每一个内容,哪怕只有一行代码\u003C\u002Fb\u003E\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T11:17:22+08:00&,&url&:&\u002Fp\u002F&,&title&:&一次记忆犹新的服务端崩溃&,&summary&:&\u003Cb\u003E现象:\u003C\u002Fb\u003E服务端不定时崩溃,每次崩溃查看调用栈都是std::map里的insert之类的操作,而且崩溃的具体指令不同,崩溃比较频繁,可能一个小时就出多次.\u003Cb\u003E分析:\u003C\u002Fb\u003E经过多次崩溃core文件的分析,几乎确定是堆被写坏了,导致在分配或释放内存的时候崩溃.别问我为什么确定是堆被写…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:34,&likesCount&:66},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&WinDbg&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&软件调试&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&C \u002F C++&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&low b一个&,&isFollowing&:false,&hash&:&d570a141b59ffe4f079f&,&uid&:32,&isOrg&:false,&slug&:&jilinxiaohuo&,&isFollowed&:false,&description&:&&,&name&:&吉林小伙&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fjilinxiaohuo&,&avatar&:{&id&:&2d64fcfdb33dd6a5bf893cca6179734e&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&jilinxiaohuo&,&name&:&各种Crash&},&content&:&同事客户端崩溃,索dmp,上windbg:\u003Cp\u003E\u003Cb\u003E0:000& .ecxr\u003C\u002Fb\u003E\u003C\u002Fp\u003Eeax= ebx=19eeddb0 ecx=19eeddb0 edx=2b7e011c esi=05beaf80 edi= \u003Cbr\u003E\u003Cb\u003Eeip=004d7bd8\u003C\u002Fb\u003E esp= ebp= iopl=0
nv up ei pl nz na po nc\u003Cbr\u003Ecs=0023
efl=3Cbr\u003Egame!CRideBase::GetCurPassengerNum+0x8:\u003Cbr\u003E\u003Cb\u003E004d7bd8 cc
3\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cp\u003E根据加粗指令可知,竟然执行到了int 3指令,也就是eip不对了,eip不对情况有很多,我前面有篇文章介绍了,有兴趣的去看看.下面我们看看下为什么eip的值不对了:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0:000& kb 1\u003C\u002Fb\u003E\u003Cbr\u003EChildEBP RetAddr
Args to Child
\u003Cbr\u003E \u003Cb\u003E1000be66 \u003C\u002Fb\u003E19eeddb0 05beaf80
game!CRideBase::GetCurPassengerNum+0x8\u003C\u002Fp\u003E\u003Cp\u003E查看调用栈,根据返回地址看看是哪里调用到了int 3,加粗的地址为RetAddr\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003Cb\u003E0:000& ub \u003C\u002Fb\u003E\u003Cbr\u003E\u003Cb\u003E1000be60 ff15d4480410
dword ptr [Script!CallThisCallFunctionQWord ()]\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E上面这条指令是call [],看看里的地址是多少\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0:000& dd
L1\u003Cbr\u003E
3C\u002Fb\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E地址里的值是1000ba10,然后看看这个函数的汇编,\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0:000& u \u003C\u002Fb\u003E\u003Cbr\u003E
ebp\u003Cbr\u003Ebec
ebp,esp\u003Cbr\u003E
ecx\u003Cbr\u003E1000ba14 dbe3
fninit\u003Cbr\u003Eb4d10
ecx,dword ptr [ebp+10h]\u003Cbr\u003Eb450c
eax,dword ptr [ebp+0Ch]\u003Cbr\u003Ec1
eax,ecx\u003Cbr\u003Ef900
ecx,0\u003Cbr\u003Ea
je Script!CallThisCallFunction+0x1d (1000ba2d)\u003Cbr\u003Ee804
eax,4\u003Cbr\u003E1000ba26 ff30
dword ptr [eax]\u003Cbr\u003Ee904
ecx,4\u003Cbr\u003Ef6
jne Script!CallThisCallFunction+0x13 (1000ba23)\u003Cbr\u003E\u003Cb\u003Eb4d08
ecx,dword ptr [ebp+8]\u003Cbr\u003E1000ba30 ff5514
dword ptr [ebp+14h]\u003C\u002Fb\u003E\u003Cbr\u003E
ecx\u003Cbr\u003Ed
ebp\u003Cbr\u003E
ret\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E只有加粗的地方才有call,根据寄存器里的值看看call到哪里去了,\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0:000& r ecx\u003C\u002Fb\u003E\u003Cbr\u003ELast set context:\u003Cbr\u003Eecx=19eeddb0\u003Cbr\u003E\u003Cb\u003E0:000& dd ebp+8 L1\u003C\u002Fb\u003E\u003Cbr\u003Eeeddb0\u003C\u002Fp\u003E\u003Cp\u003E根据指令mov ecx,dword ptr [ebp+8],可知,如果ebp的值还没有被改变,那么ecx里的值应该等于ebp+8里的值,所以指向两条指令检测一下,证明ebp很有可能还没有被改变,接下来看下面指令,\u003Cbr\u003E\u003Cb\u003E0:000& dd ebp+14 L1\u003C\u002Fb\u003E\u003Cbr\u003E67d4c0\u003Cbr\u003E这是call dword ptr [ebp+14h]调用的地址,看看这个函数里干了什么:\u003Cbr\u003E\u003Cb\u003E0:000& u
L10\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003Egui!gui::control::visible\u003Cbr\u003E\u003C\u002Fb\u003E 8a5161
dl,byte ptr [ecx+61h]\u003Cbr\u003E 8b442404
eax,dword ptr [esp+4]\u003Cbr\u003E c0ea03
dl,3\u003Cbr\u003E0167d4ca 80e201
dl,1\u003Cbr\u003E0167d4cd 3ad0
dl,al\u003Cbr\u003E0167d4cf 7409
gui!gui::control::visible+0x1a (0167d4da)\u003Cbr\u003E 8b11
\u003Cb\u003Emov
edx,dword ptr [ecx]\u003C\u002Fb\u003E\u003Cbr\u003E
dword ptr [esp+4],eax\u003Cbr\u003E ff6244
\u003Cb\u003Ejmp
dword ptr [edx+44h]\u003C\u002Fb\u003E\u003Cbr\u003E0167d4da c20400
4\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E根据加粗可知是调用的visible函数, 指令 mov edx,dword ptr [ecx]把虚表指针赋值给edx,然后跳转到虚表里偏移44h那个函数去执行,这也是一种虚函数调用的优化方式,不用call,就不要压栈返回地址了,我们知道ecx里的值是19eeddb0,所以看看虚表指针是多少,\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0:000& dd 19eeddb0 L1\u003C\u002Fb\u003E\u003Cbr\u003E19eeddb0
2b7e011c\u003C\u002Fp\u003E\u003Cp\u003E然后去虚表2b7e011c里找到偏移44h的地址,\u003Cbr\u003E\u003Cb\u003E0:000& dd 2b7e011c + 44 L1\u003C\u002Fb\u003E\u003Cbr\u003E2b7ebd8\u003Cbr\u003E\u003Cb\u003E0:000& r eip\u003C\u002Fb\u003E\u003Cbr\u003ELast set context:\u003Cbr\u003Eeip=004d7bd8\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E经过对比,发现虚表里偏移44的地址正是eip的值,而这个eip是错的,那就可能是虚表地址就不对,\u003C\u002Fp\u003E\u003Cp\u003E根据gui!gui::control::visible可知,调用visible的对象是gui!gui::control,那看看control的虚表,\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0:000& x gui!gui::control::*vftable*\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cb\u003E3C\u002Fb\u003E gui!gui::control::`vftable' = &no type information&\u003Cbr\u003E0:000& \u003Cb\u003Edds
+ 44 L1\u003C\u002Fb\u003E\u003Cbr\u003E
gui!gui::control::on_visible \u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E恰好是源码中要调用的on_visible,\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Evoid control::visible(bool v)\n{\n
if(m_visible == v)\n
on_visible(v);\n}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E根据源码和指令可知,正确的虚表地址应该是, 因此可以断定虚表指针的值是错的,那为什么会错呢?\u003C\u002Fp\u003E\u003Cp\u003E那特么可能就多了,有可能是this指针就是错的,有可能this是对的,但是虚表指针被写坏了,还有可能是对象已经被释放了,反正各种可能导致虚表指针错了,我是分析不出来了.我最讨厌这样的bug了,分析半天最后发现离找到根本原因还很远,整个人都不好了,所以就写这些吧,如果你能看懂,那么恭喜你,你已经掌握了调试dmp的最常用的一种思路了.\u003C\u002Fp\u003E\u003Cp\u003Eps:最后你应该发现了,其实出现在调用栈里的GetCurPassengerNum根本就没人调用它,只不过因为虚表指针出问题了,导致eip错了,执行到哪就会显示哪个符号,试想一下,如果eip恰好是一系列可以运行的指令,那就给我们的分析增加难度了\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T14:44:53+08:00&,&url&:&\u002Fp\u002F&,&title&:&一次虐心的调试&,&summary&:&同事客户端崩溃,索dmp,上windbg:\u003Cb\u003E0:000& .ecxr\u003C\u002Fb\u003Eeax= ebx=19eeddb0 ecx=19eeddb0 edx=2b7e011c esi=05beaf80 edi= \u003Cb\u003Eeip=004d7bd8\u003C\u002Fb\u003E esp= ebp= iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b …&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:13,&likesCount&:16}},&annotationDetail&:null,&commentsCount&:53,&likesCount&:190,&FULLINFO&:true}},&User&:{&jilinxiaohuo&:{&isFollowed&:false,&name&:&吉林小伙&,&headline&:&&,&avatarUrl&:&https:\u002F\\u002F50\u002F2d64fcfdb33dd6a5bf893cca6179734e_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&jilinxiaohuo&,&bio&:&low b一个&,&hash&:&d570a141b59ffe4f079f&,&uid&:32,&isOrg&:false,&description&:&&,&badge&:{&identity&:null,&bestAnswerer&:null},&profileUrl&:&https:\u002F\\u002Fpeople\u002Fjilinxiaohuo&,&avatar&:{&id&:&2d64fcfdb33dd6a5bf893cca6179734e&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&nwebStickySidebar&:&sticky&,&androidPassThroughPush&:&all&,&newMore&:&new&,&newAppViewRelatedAd&:&yes&,&liveReviewBuyBar&:&live_review_buy_bar_2&,&liveStore&:&ls_a2_b2_c1_f2&,&qawebThumbnailAbtest&:&new&,&searchHybridTabs&:&without-tabs&,&iOSEnableFeedModuleWWANAritclePreRender&:&iOS_FeedModule_WWAN_PreRender_Enable&,&isOffice&:&false&,&enableTtsPlay&:&false&,&liveDetailWechatBanner&:&Live_detail_wechat_banner_1&,&wechatShareModal&:&wechat_share_modal_show&,&newLiveFeedMediacard&:&old&,&homeUi2&:&default&,&showVideoUploadAttention&:&false&,&recommendationAbtest&:&new&,&marketTab&:&market_tab_old&,&qrcodeLogin&:&qrcode&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&androidDbRecommendAction&:&open&,&zcmLighting&:&zcm&,&favAct&:&default&,&appStoreRateDialog&:&close&,&mobileQaPageProxyHeifetz&:&m_qa_page_nweb&,&default&:&None&,&isNewNotiPanel&:&yes&,&androidDbRepinSelection&:&open&,&nwebRelatedAdvert&:&default&,&qaStickySidebar&:&sticky_sidebar&,&androidProfilePanel&:&panel_b&,&nwebWriteAnswer&:&experiment&}},&columns&:{&next&:{},&jilinxiaohuo&:{&following&:false,&canManage&:false,&href&:&\u002Fapi\u002Fcolumns\u002Fjilinxiaohuo&,&name&:&各种Crash&,&creator&:{&slug&:&jilinxiaohuo&},&url&:&\u002Fjilinxiaohuo&,&slug&:&jilinxiaohuo&,&avatar&:{&id&:&43e82dc6d0adfdcd0760f&,&template&:&https:\u002F\\u002F{id}_{size}.jpeg&}}},&columnPosts&:{},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&switches&:{&couldSetPoster&:false},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{&baidu&:false,&yidianzixun&:false,&qqnews&:false},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false,&userAgent&:{&ua&:&Mozilla\u002F5.0 (compatible, MSIE 11, Windows NT 6.3; Trident\u002F7.0; rv:11.0) like Gecko&,&browser&:{&name&:&IE&,&version&:&11&,&major&:&11&},&engine&:{&version&:&7.0&,&name&:&Trident&},&os&:{&name&:&Windows&,&version&:&8.1&},&device&:{},&cpu&:{}}},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}}

我要回帖

更多关于 32位dll转64位 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信