看板 EE_DSnP 關於我們 聯絡資訊
呃...話說我一直掙扎到底要不要把這個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
a3785lexx:歐對了,其實我爬文有爬到類似問題 12/06 02:01
a3785lexx:不過沒有看到解答...XDrz 12/06 02:02
anfranion:看起來頗像是你的記憶體沒有控制好 12/06 08:05
anfranion:像是你把local變數的位置存起來了之類的 12/06 08:05
anfranion:不然就是超過記憶體上限囉 ̄▽ ̄) 12/06 08:06
timrau:請使用debugger.... 12/06 09:42
timrau:不用設breakpoint,直接給他run下去就會停在死亡處了 12/06 09:44
dryman:如果你是用有history的iterator的話,小心會有mem fragment 12/06 09:51
whing1332:root是begin的話要小心喔 因為在adtp -r時他還是會-- 12/06 15:47
whing1332:雖然我不知道你的是不是這個問題啦 12/06 15:48
dryman:root應該不可以是begin吧..@ @ 12/06 16:02
dryman:我懂樓上的意思了XD 12/06 16:02
a3785lexx:感謝樓上各位強者的指導XD 12/07 20:05
a3785lexx:話說剛剛我把-g加回去要用DDD跑它 12/07 20:05
a3785lexx:結果發現用-g compile完的檔案,它怎麼也不出包...囧 12/07 20:06
a3785lexx:敢問這種情況我該如何是好......orz 12/07 20:06
timrau:看valgrind有沒有辦法救你... 12/07 20:38
a3785lexx:剛剛吃晚餐前鼓起勇氣把一次按順序加1000000個東西丟給 12/07 22:20
a3785lexx:DDD跑,結果就跑出最後我有pointer指去oxbffff11c 12/07 22:21
a3785lexx:於是寫一個小程式直接用pointer存取oxbffff11c 12/07 22:22
a3785lexx:果然直接掛了......這難道是原因嗎? 12/07 22:22
a3785lexx:另外感謝tim大...我正在玩valgrind XD 12/07 22:22
ric2k1:像 adt 這樣的 code, functions 之間常常是獨立的, 可以試 12/07 22:23
ric2k1:看 comment out 掉一些 code (divide and conquer) 12/07 22:25
a3785lexx:我重新寫了一下我的erase 12/08 00:52
a3785lexx:原本因為會一直去找successor的successor 12/08 00:52
a3785lexx:(如果被erase的目標的successor還有successor的話會去 12/08 00:53
a3785lexx:考慮的意思) 12/08 00:53
a3785lexx:可能這樣在資料先排整齊才塞進去的情況下深度太深了 12/08 00:53
a3785lexx:改成直接把successor的child接到他的parent上後 12/08 00:54
a3785lexx:暫時就不會這樣crash法了....... 12/08 00:54
a3785lexx:所以不知道是不是因為recursive call作太多次會出包呢? 12/08 00:54
a3785lexx:會有這種可能嗎?? 12/08 00:55
a3785lexx:因為我用valgrind得到的結果是:main thread stack 12/08 00:55
a3785lexx:over flow之類的.... 12/08 00:55
a3785lexx:不過我不太懂什麼是main thread stack.......XD 12/08 00:56
ric2k1:type the command "limit" under linux shell, you'll see 12/08 02:06
timrau:"limit" in csh/tcsh, or "ulimit" in bash 12/08 07:26