C++ Boehm GC++;垃圾收集器:堆段过多会增加MAXHINCR或MAX_堆段

C++ Boehm GC++;垃圾收集器:堆段过多会增加MAXHINCR或MAX_堆段,c++,boehm-gc,C++,Boehm Gc,我在应用程序中使用了BeHM C++垃圾收集器。该应用程序使用Levenshtein确定性有限自动机Python程序计算两个字符串之间的Levenshtein距离。我已经使用GCC 4.1.2、将Python程序移植到C++的CCENS版本上。 最近,我注意到在我运行应用程序超过10分钟后,我收到SIGABRT错误消息:堆节过多:增加MAXHINCR或MAX\u heap\u SECTS。我想知道是否有人知道如何解决这个问题 这是我的gdb堆栈跟踪。多谢各位 Program received

我在应用程序中使用了BeHM C++垃圾收集器。该应用程序使用Levenshtein确定性有限自动机Python程序计算两个字符串之间的Levenshtein距离。我已经使用GCC 4.1.2、

将Python程序移植到C++的CCENS版本上。 最近,我注意到在我运行应用程序超过10分钟后,我收到SIGABRT错误消息:
堆节过多:增加MAXHINCR或MAX\u heap\u SECTS
。我想知道是否有人知道如何解决这个问题

这是我的gdb堆栈跟踪。多谢各位

  Program received signal SIGABRT, Aborted.
(gdb) bt
#0  0x002ed402 in __kernel_vsyscall ()
#1  0x00b1bdf0 in raise () from /lib/libc.so.6
#2  0x00b1d701 in abort () from /lib/libc.so.6
#3  0x00e28db4 in GC_abort (msg=0xf36de0 "Too many heap sections: Increase MAXHINCR or MAX_HEAP_SECTS")
    at ../Source/misc.c:1079
#4  0x00e249a0 in GC_add_to_heap (p=0xb7cb7000, bytes=65536) at ../Source/alloc.c:812
#5  0x00e24e45 in GC_expand_hp_inner (n=16) at ../Source/alloc.c:966
#6  0x00e24fc5 in GC_collect_or_expand (needed_blocks=1, ignore_off_page=0) at ../Source/alloc.c:1032
#7  0x00e2519a in GC_allocobj (sz=6, kind=1) at ../Source/alloc.c:1087
#8  0x00e31e90 in GC_generic_malloc_inner (lb=20, k=1) at ../Source/malloc.c:138
#9  0x00e31fde in GC_generic_malloc (lb=20, k=1) at ../Source/malloc.c:194
#10 0x00e322b8 in GC_malloc (lb=20) at ../Source/malloc.c:319
#11 0x00df5ab5 in gc::operator new (size=20) at ../Include/gc_cpp.h:275
#12 0x00de7cb7 in __automata_combined_test2__::DFA::levenshtein_automata (this=0xb7b49080, term=0xb7cb5d20, k=1) 
at ../Source/automata_combined_test2.cpp:199
#13 0x00e3a085 in cDedupe::AccurateNearCompare (this=0x8052cd8, 
    Str1_=0x81f1a1d "GEMMA     OSTRANDER GEM 10   
DICARLO", ' ' <repeats 13 times>, "01748SUE       WOLFE     SUE 268  POND", ' ' <repeats 16 times>, 
"01748REGINA    SHAKIN    REGI16   JAMIE", ' ' <repeats 15 times>, "01748KATHLEEN  MAZUR     CATH10   JAMIE    "
..., 
    Str2_=0x81f2917 "LINDA     ROBISON   LIN 53   CHESTNUT", ' ' <repeats 12 times>, 
"01748MICHELLE  LITAVIS   MICH15   BLUEBERRY", ' ' <repeats 11 times>, "01748JOAN      TITUS     JO  6    SMITH", 
' ' <repeats 15 times>, "01748MELINDA   MCDOWELL  MEL 24   SMITH    "..., Size_=10, 

我想知道是否有可能修改此函数以修复分段错误。谢谢。

我终于想出办法修复GC内存不足分段错误。我替换了python程序中的setdefault和get构造。例如,我将self.transitions.setdefault(src,{}).setdefault(input,set()).add(dest)python语句替换为:

  Program received signal SIGABRT, Aborted.
(gdb) bt
#0  0x002ed402 in __kernel_vsyscall ()
#1  0x00b1bdf0 in raise () from /lib/libc.so.6
#2  0x00b1d701 in abort () from /lib/libc.so.6
#3  0x00e28db4 in GC_abort (msg=0xf36de0 "Too many heap sections: Increase MAXHINCR or MAX_HEAP_SECTS")
    at ../Source/misc.c:1079
#4  0x00e249a0 in GC_add_to_heap (p=0xb7cb7000, bytes=65536) at ../Source/alloc.c:812
#5  0x00e24e45 in GC_expand_hp_inner (n=16) at ../Source/alloc.c:966
#6  0x00e24fc5 in GC_collect_or_expand (needed_blocks=1, ignore_off_page=0) at ../Source/alloc.c:1032
#7  0x00e2519a in GC_allocobj (sz=6, kind=1) at ../Source/alloc.c:1087
#8  0x00e31e90 in GC_generic_malloc_inner (lb=20, k=1) at ../Source/malloc.c:138
#9  0x00e31fde in GC_generic_malloc (lb=20, k=1) at ../Source/malloc.c:194
#10 0x00e322b8 in GC_malloc (lb=20) at ../Source/malloc.c:319
#11 0x00df5ab5 in gc::operator new (size=20) at ../Include/gc_cpp.h:275
#12 0x00de7cb7 in __automata_combined_test2__::DFA::levenshtein_automata (this=0xb7b49080, term=0xb7cb5d20, k=1) 
at ../Source/automata_combined_test2.cpp:199
#13 0x00e3a085 in cDedupe::AccurateNearCompare (this=0x8052cd8, 
    Str1_=0x81f1a1d "GEMMA     OSTRANDER GEM 10   
DICARLO", ' ' <repeats 13 times>, "01748SUE       WOLFE     SUE 268  POND", ' ' <repeats 16 times>, 
"01748REGINA    SHAKIN    REGI16   JAMIE", ' ' <repeats 15 times>, "01748KATHLEEN  MAZUR     CATH10   JAMIE    "
..., 
    Str2_=0x81f2917 "LINDA     ROBISON   LIN 53   CHESTNUT", ' ' <repeats 12 times>, 
"01748MICHELLE  LITAVIS   MICH15   BLUEBERRY", ' ' <repeats 11 times>, "01748JOAN      TITUS     JO  6    SMITH", 
' ' <repeats 15 times>, "01748MELINDA   MCDOWELL  MEL 24   SMITH    "..., Size_=10, 
 if src not in self.transitions:
    self.transitions[src] = {}
 result = self.transitions[src]
 if input not in result:
    result[input] = set()
 result[input].add(dest)
此外,我还替换了python语句:

new_states = self.transitions.get(state, {}).get(NFA.EPSILON, set()).difference(states)
与:

最后,我确保将
\uuu shedkin\uuu.init()
放在for或while循环之外
\uu shedskin\uu.init()
调用GC分配器。所有这些更改的目的是降低GC分配器上的压力


我已经用300万次对GC分配器的调用测试了这些更改,但我还没有得到分段错误。多谢各位

增加MAXHINCR或MAX_HEAP_SECTS
可能值得重复,但不确定,因为您从未提及实际执行此操作。Hans Passant,我尝试增加MAXINCHR和MAX_HEAP_SECTS,但是,我在alloc.c的第1039行收到一条警告消息。警告信息显示“内存不足!”!归零!“。另外,gdb告诉我shedskin文件builtin.hpp的第117行出现分段错误。谢谢你的建议。那么你为什么要使用Boehm收集器?你的程序有内存泄漏,还是没有删除或其他内容?只是好奇。Emery,我使用Boehm收集器是因为原来的Levenshtein DFA程序是用Python编写的。我用Shedskin把LVENHTETIN DFPython程序转换成C++ + Shedskin uses Boehm收集器用于C++垃圾回收。Shedskin不生成删除。Frcor,只要您想提供附加信息,请编辑您的问题。
        if state not in self.transitions:
           self.transitions[state] = {}
        result = self.transitions[state]    
        if NFA.EPSILON not in result:
           result[NFA.EPSILON] = set()
        cook = result[NFA.EPSILON]      
        new_states = cook.difference(states)