作者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