我正在开发一个国际象棋引擎,在查找表中存储了许多预先计算的值。我将这些值放入一个(非常大的)"magic_numbers.c"文件中(来自名为magic-bitboard的算法),并将它们声明为全局常量内存。这些值在程序执行过程中永远不会更改。
我最近遇到了一个seg。这是一个相当奇怪的错误。(首先,这很奇怪,因为它挂断了我的整个电脑!)但更重要的是,地址是完全可以访问的(注意下面的GDB输出)。
程序接收到信号SIGSEGV,分段故障。[切换到线程0x7ffe8dd77700(LWP 9001)]0x000000000040c9b9在/home/jordan/Projects/thekingsoms/magic.h:107的magic_get_king_moves(occ=0,square=28'\034')中107返回magic_king_moves[square];(gdb)p magic_king_moves[28]1美元=241461362688(gdb)p位板_打印(magic_king_oves[28])Bitboard。。。…1 1 1。…1 1 1。…1 1 1。。。$2=无效(gdb)bt#magic_get_king_moves中的0 0x000000000040c9b9(occ=0,square=28'\034')在/home/jordan/Projects/thekingsoms/magic.h:107#在/home/jordan/Projects/thekingsomen/pawn处有1个pawn_eval_init(板=0x7ffe8dd76e20,pe=0x7fe8dd70fc0)。c:41#2当押_价值_价值=ptt@entry=0x7ffe780008d0,板=board@entry=0x7ffe8dd76e20)在/home/jordan/Projects/thekingsmen/poon.c:12#评估中的3 0x000000000040ab6b(板=0x7ffe8dd76e20,搜索=0x7ffe780008c0)网址:/home/jordan/Projects/thekingsmens/evaluation.c:384#qsearch中的4 0x00000000004063ef(alpha=-10000000,beta=293,depth=-2,checks_depth=12583424,search=0x7ffe780008c0)在/home/jordan/Projects/thekingsmen/search.c:63#qsearch中的5 0x0000000000406576(alpha=-293,beta=1000000000,depth=3868,checks_depth=12583424,search=0x7ffe780008c0)在/home/jordan/Projects/thekingsmen/search.c:148#qsearch中的6 0x0000000000406576(alpha=-10000000,beta=1000000000,depth=2349,checks_depth=12583424,checks_depth@entry=0,search=0x7ffe780008c0)在/home/jordan/Projects/thekingsmen/search.c:148#do_evaluation_thread中的7 0x0000000000404e57(params=0x7fffffdd68)在/home/jordan/Projects/thekingsom/teaker.c:299#8来自/usr/lib/lipthread.so.0的start_thread()中的0x00007ffff78c0374#从/usr/lib/libc.so.6克隆()中的9 0x00007ffff6d9027d
当我关闭线程时也会发生这种情况。
我已经通过valgrind的memcheck运行了这个程序,它没有报告任何可疑的事情。
seg。当我关闭优化时,错误确实会消失,所以我倾向于认为它在某个地方是未定义的行为,但我仍然不明白为什么它无法访问我可以从GDB中访问的内存。
编辑:内存在文件"magic_numbers.c"中声明为:
const bitboard_t magic_king_moves[0x40]={0x303,0x707,0xe0e,0x1c1c,0x3838,0x7070,0xe0e0,。。。
bitboard_t是一个类型定义uint64_t。
这个代码是由我一直在开发的一个单独的工具自动生成的
谢谢,
Jordan
我还没有找到确切的错误,但上面的GDB输出中发生了什么非常清楚。堆栈帧#6处的"depth"参数是疯狂的,"checks_depth"也是如此。有些东西正在覆盖堆栈上的值(看起来是在任意点),这导致它覆盖返回地址。
seg错误不是在访问内存时发生的,而是在试图返回到原来的位置时发生的。
有趣的是,在堆栈溢出时谈论堆栈溢出:)