首页
社区
课程
招聘
[旧帖] [原创]史上最牛资料助你解惑c++调试 0.00雪花
发表于: 2010-1-5 16:46 2099

[旧帖] [原创]史上最牛资料助你解惑c++调试 0.00雪花

2010-1-5 16:46
2099
在程序的调试过程中,难免会出现这样或那样的错误。
对于一些简单的错误我们很容易识别,而对于错误的提示,
往往一些奇怪的字符串让我们头痛。如下图:

        error LNK2001: unresolved external symbol
        "public: struct time & __thiscall dad::gettime(void)"
        (?gettime@dad@@QAEAAUtime@@XZ)

这一串似懂非懂的字符串到底是什么意思呢?

        在一次学习汇编与C混合编程的过程中,我意思到了这个
问题的严重性,于是我去查了一下MSDN,结果里面没有(最近的版本有没有我不知道,反正我的没有)。于是我根据那本书上讲的原理,
把这方面的资料通过实例程序找了出来。可以利用VC环境编译选项生成
.map文件,然后通过观察.map文件的内容,经过一一甄别得到如下内容。
正因为我在网上没有见到类似的东西,故以此与大家分享。

类型                        符号表示(在编译后显示的代号)
Char                        D
Unsigned char                E
Short                        F
Unsigned short                G
Int                        H
Unsigned int                I
Long                        J
Unsigned long                K
Float                        M
Double                        N               
Void                        X
Bool                        _N
&                        AA
*                        PA
[]                        QA
多维数组                          数组的最大维数是11,分别用Y0-Y9表示。
                        第一维是默认的,无需标记,第2-11维都要标记,
                        分别用数字加上@符号表示。数字1-14的单独表示
                        为1-9,L-P.而后面的数字则采用16进制表示,为A-P,
                        如15(BA),20(BE),32(CA),例子:int [][20][30]
                        -----        QAY1BE@BO@H

结构                        用U和@@表示。如定义了time结构,则time t对应Utime@@

多结构多参数                此次参数为&,*,**,[]等附加标志。在这种情况下,
                        都采用简化表示法:1-每遇到一种新的结构,采用上                       
                        述方法定义;2-遇到带旧附加标、志旧结构,则用阿拉伯
                        数字表示(从0开始),这些数字是这样产生的--------定义2个
                                变量cnt=0,num=0,在编译参数列表时,每遇到一个新
                                结构,cnt++,num++;每遇到一个带新附加标志的旧
                                结构,cnt++。而简化表示就是  用cnt代替的。3-每遇到
                                带新附加标志的旧结构,则在U前面加上附加标志的
                        符号表示,在U后面加上num@@。如下例中的time &表示
                               为AAU2@。
                        举例: 对于参数列表(stu a,stu b,time c,time &d,
                                                time e,time & f),
                        其对应的编译结果是Ustu@@ 0 Utime@@ AAU2@ 1 2

类                        V+类名+@@
普通成员函数                ?+函数名+@@+返回值类型+参数列表编译结果+Z
类的成员函数                ?+函数名+@类名+@@+返回值类型++参数列表编译结果+Z
返回值类型                           普通函数以YA+类型表示,而类的成员函数用QAE+类型表示
参数列表                           若空则为X,否则各个参数按上述类型对应,最后加上@。

现在大家应该知道上面的那一串错误提示是什么了吧,?gettime@dad@@QAEAAUtime@@XZ表示dad类的一个成员函数gettime,且该成员函数没有参数,返回类型是time&(AAUtime@@)。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
受教了 感谢lz分享 正在学习中
2010-1-5 22:44
0
雪    币: 8026
活跃值: (2511)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mangle
2010-1-7 20:09
0
雪    币: 263
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
百度有讲的啊
2010-1-7 20:16
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没怎么看懂,唉,再学学去……
2010-1-7 22:50
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好东西   谢谢分享1
2010-1-8 01:28
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
厉害呀,楼主,我来学习了
2010-1-10 17:03
0
雪    币: 324
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
总结的不错,主要是用的方法比较好,值得借鉴!
2010-1-13 16:17
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢 楼住 好东西
2010-1-13 16:32
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
VC菜鸟路过~偶尔用VC的时候出了个错还真是弄的我手忙脚乱,勉勉强强搞定····
多谢LZ提供参考
2010-1-13 17:39
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错,学习了,受教中。。。
2010-1-13 18:02
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看不懂,谢谢楼主分享
2010-1-16 16:03
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
原来如此,谢谢了
2010-1-16 21:25
0
雪    币: 17
活跃值: (308)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
VC系列的编译器对变量采取了名字粉碎法。可在VC命令行环境下使用 undname 函数名 /变量名  来还原被粉碎后的名字。
2010-1-16 22:22
0
雪    币: 517
活跃值: (64)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
15
非常感谢楼主,虽然知道名字粉碎法,但一直没有关注

非常感谢楼上,让我知道了undname

跟了一下undname,程序只用了一个API
UnDecorateSymbolName

试了一下,非常棒
2010-1-16 23:08
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
恩,很好的解释,,之前我被这样的问题困饶了好久,,虽然解决了,但从未像LZ这样仔细分析过,,十分感谢LZ分享好东东
2010-1-16 23:14
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
厉害呀,楼主,我来学习了
2010-1-17 10:42
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
没看懂。学习中
2010-1-17 21:51
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢楼主分享。。不错,,学习学习
2010-1-18 13:56
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
有点差分法解密的意思...
看来Map文件的确不可小看
2010-1-18 15:13
0
雪    币: 401
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
汗 楼主实现太伟大了 真是学习了
2010-1-18 15:32
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
非常感谢楼主, 被这个问题困扰了许多次了。
2010-1-18 17:57
0
游客
登录 | 注册 方可回帖
返回
//