作者a3785lexx (Alex)
看板EE_DSnP
标题[求救]BST自测发现的怪问题...
时间Sun Dec 6 01:56:59 2009
呃...话说我一直挣扎到底要不要把这个bug PO上来问
一方面因为debug de不出来跑上来问好像不太对
另一方面我觉得这个bug我不说大概不太容易被助教抓出来XD?
但是我今天花了很多时间自己去de他
怎麽也de不到,而且是很诡异的bug
所以就想说还是来求救好了XD
事情是这样的,为了写adtComp.pdf
我自己写了几个do file外加作了一个指令
专门用来生成按照顺序排好的数列存入container
是为了要去测最坏情况...
可是,囧事就发生在我测试的过程中...
首先
adt>adtr 100000(这里好像部一定要多大,太小就不会爆bug
可是到多小才没事我还没去测出来)
adt>oa 72778(这是用来生产0~72777的指令
oa是ordered add XD 一定要大於等於某值才会出事)
adt>adtd -min 1
=>爆,程式记忆区段错误 囧
我本来想要用cout大法去解决他
可是发现每当我多compile一次
他好像就不会在原来会爆掉的点必死了...
(第一次发现bug的时候测出来那时候只要大於72778就必死
反之小於72778就不会死的感觉)
我还有重开机测试过,没有重新compile过的话
原来会挂的点大概是不会变的
但是我一直没有把不会立刻爆的情况这个给跑完...XD
因为只跑10000就要五分多钟了 囧
总之这里怎麽样都很玄妙啊
oa一定要大於某值,而且这个值好像每compile一次就不一样囧
而且会爆的那个定值都很明显,通常只有两种情况
1.一下完指令就程式区段错误->结束
2.我有加cout或assert,跑很久不会程式取断错误,不过没有等他跑完过
另外,其实oa 72778 -r adtd -max 1这种也会挂...
oa -r会产生由大到小的序列
总之好像关键是一开始就跑去找root事情就不妙?
可是每compile一次必死点就换一个地方到底是怎麽回事啊...
这实在太诡异了...
而且cout也不太能拿来用...这怎麽办啊囧rz
话说助教也会用这样的序列来测作业吗XD?
如果没有的话大概可以逃过一劫...XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.37.102.193
1F:→ a3785lexx:欧对了,其实我爬文有爬到类似问题 12/06 02:01
2F:→ a3785lexx:不过没有看到解答...XDrz 12/06 02:02
3F:推 anfranion:看起来颇像是你的记忆体没有控制好 12/06 08:05
4F:→ anfranion:像是你把local变数的位置存起来了之类的 12/06 08:05
5F:→ anfranion:不然就是超过记忆体上限罗 ̄▽ ̄) 12/06 08:06
6F:推 timrau:请使用debugger.... 12/06 09:42
7F:→ timrau:不用设breakpoint,直接给他run下去就会停在死亡处了 12/06 09:44
8F:推 dryman:如果你是用有history的iterator的话,小心会有mem fragment 12/06 09:51
9F:推 whing1332:root是begin的话要小心喔 因为在adtp -r时他还是会-- 12/06 15:47
10F:→ whing1332:虽然我不知道你的是不是这个问题啦 12/06 15:48
11F:推 dryman:root应该不可以是begin吧..@ @ 12/06 16:02
12F:→ dryman:我懂楼上的意思了XD 12/06 16:02
13F:→ a3785lexx:感谢楼上各位强者的指导XD 12/07 20:05
14F:→ a3785lexx:话说刚刚我把-g加回去要用DDD跑它 12/07 20:05
15F:→ a3785lexx:结果发现用-g compile完的档案,它怎麽也不出包...囧 12/07 20:06
16F:→ a3785lexx:敢问这种情况我该如何是好......orz 12/07 20:06
17F:推 timrau:看valgrind有没有办法救你... 12/07 20:38
18F:→ a3785lexx:刚刚吃晚餐前鼓起勇气把一次按顺序加1000000个东西丢给 12/07 22:20
19F:→ a3785lexx:DDD跑,结果就跑出最後我有pointer指去oxbffff11c 12/07 22:21
20F:→ a3785lexx:於是写一个小程式直接用pointer存取oxbffff11c 12/07 22:22
21F:→ a3785lexx:果然直接挂了......这难道是原因吗? 12/07 22:22
22F:→ a3785lexx:另外感谢tim大...我正在玩valgrind XD 12/07 22:22
23F:推 ric2k1:像 adt 这样的 code, functions 之间常常是独立的, 可以试 12/07 22:23
24F:→ ric2k1:看 comment out 掉一些 code (divide and conquer) 12/07 22:25
25F:→ a3785lexx:我重新写了一下我的erase 12/08 00:52
26F:→ a3785lexx:原本因为会一直去找successor的successor 12/08 00:52
27F:→ a3785lexx:(如果被erase的目标的successor还有successor的话会去 12/08 00:53
28F:→ a3785lexx:考虑的意思) 12/08 00:53
29F:→ a3785lexx:可能这样在资料先排整齐才塞进去的情况下深度太深了 12/08 00:53
30F:→ a3785lexx:改成直接把successor的child接到他的parent上後 12/08 00:54
31F:→ a3785lexx:暂时就不会这样crash法了....... 12/08 00:54
32F:→ a3785lexx:所以不知道是不是因为recursive call作太多次会出包呢? 12/08 00:54
33F:→ a3785lexx:会有这种可能吗?? 12/08 00:55
34F:→ a3785lexx:因为我用valgrind得到的结果是:main thread stack 12/08 00:55
35F:→ a3785lexx:over flow之类的.... 12/08 00:55
36F:→ a3785lexx:不过我不太懂什麽是main thread stack.......XD 12/08 00:56
37F:推 ric2k1:type the command "limit" under linux shell, you'll see 12/08 02:06
38F:推 timrau:"limit" in csh/tcsh, or "ulimit" in bash 12/08 07:26