让VC7系列生成VC6支持PDB格式,以便VC6IDE可以调试
morning.ye 2009-9-18
我们知道 阅读VC7系列的 atl/mfc 源代码可以看到,VC7似乎具备生成 vc6 pdb文件的能力,其中参数分别是
cl.exe: /Zvc6
link.exe: /debugtype:vc6
但是,很遗憾,如果我们把这个参数加上,它们纷纷表示,不认识.
当然,到底是否支持,调试一下才知道,通过分析,发现只是前端接口关掉了,不接受这些参数,但是内部实现确实支持的.
OK,patch它们.
准备工作:
拷贝一份vc2002/2003bin目录到vc6bin目录,把vc6的改名,vc2003toolkit也可以
从PSDK/DDK2003等地方拷贝 mspdb60.dll,版本号应该是6.2
开始修改
1.1修改编译前端
分别用od加载c1.dll,c1xx.dll,搜索字符串 mspdb60.dll,在前方不远处有一个比较,记下这个全局变量的地址,在 LoadPE里转成 offset,并将原来的0改成1
c1.dll 在偏移10678a11处,将原来的0改成1
c1xx.dll 在偏移1058D3B1处,将原来的0改成1
1.2修改编译后端:c2略麻烦一点,不过调试类似,
c2.dll 在偏移1070744C处,将原来的1D改成3D
2.修改连接器
link.exe
0042A4DC 8A98 60010000 mov bl, byte ptr [eax+160]
0042A4E2 84DB test bl, bl
0042A4E4 |. 56 push esi
0042A4E5 |. 57 push edi
0042A4E6 74 0B je short link.0042A4F3
0042A4E8 |. BF AC3C4000 mov edi, link.00403CAC ; mspdb60.dll
0042A4ED |. 897C24 0C mov dword ptr [esp+C], edi
0042A4F1 |. EB 0C jmp short link.0042A4FF
0042A4F3 |> C74424 0C A03>mov dword ptr [esp+C], link.00403CA0 ; mspdb71.dll
0042A4FB |. 8B7C24 0C mov edi, dword ptr [esp+C]
0042A4FF |> 57 push edi ; /FileName
0042A500 |. FF15 A4104000 call dword ptr [<&KERNEL32.LoadLibraryA>] ; \LoadLibraryA
改成
0042A4DC B3 01 mov bl, 1 //把原来的判断改成赋值
0042A4DE 8898 60010000 mov byte ptr [eax+160], bl //
0042A4E4 |. 56 push esi
0042A4E5 |. 57 push edi
0042A4E6 90 nop //不再跳转,其实跳转也没关系,因为后面我们会替换这个名字
0042A4E7 90 nop
0042A4E8 |. BF AC3C4000 mov edi, link.00403CAC ; mspdb60.dll
0042A4ED |. 897C24 0C mov dword ptr [esp+C], edi
0042A4F1 |. EB 0C jmp short link.0042A4FF
0042A4F3 |> C74424 0C A03>mov dword ptr [esp+C], link.00403CA0 ; mspdb71.dll
0042A4FB |. 8B7C24 0C mov edi, dword ptr [esp+C]
0042A4FF |> 57 push edi ; /FileName
0042A500 |. FF15 A4104000 call dword ptr [<&KERNEL32.LoadLibraryA>] ; \LoadLibraryA
3.用16进制编译器打开 c1.dll,c1xx.dll,c2.dll,cl.exe,link.exe
搜索 pdb71.dll 全部改成 pdb60.dll
4.在link.exe中把 ?Open@PDB@@SAHPBD0KPAJQADPAPAU1@@Z 改成 ?Open@PDB@@SAHPAD0KPAJQADPAPAU1@@Z
因为 pdb60.dll 把参数声明为 char*,而pdb71.dll把参数声明为 const char*,这导致修改符不同
5.从PSDK/DDK任何能找到 mspdb60.dll的地方把 6.2 版的mspdb60.dll 拷贝进去
OK,一切搞定,现在新建一个console工程,编译debug配置,可以看到 生成的文件内部已经是 NB10 标记的 PDB 文件了,开始调试,不再提示没有符号文件,可以正常显示变量等信息.
附件已上传,是基于VC7.1SP1修改的,不打算自己挨个改一遍的朋友,找个VC2003bin目录拷贝后,用压缩包里的文件覆盖一下就OK了.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!