C++ 分析windows上截短的linux内核转储

C++ 分析windows上截短的linux内核转储,c++,debugging,gdb,coredump,C++,Debugging,Gdb,Coredump,我和一个朋友写了一个国际象棋引擎,他参加了顶级国际象棋引擎锦标赛(TCEC)。尽管我们的引擎在一场被认为是失败的比赛中发生了故障,但我们还是在资格赛中排名第一。我确实了解C++编程的基本知识,但我一直坚持分析产生的堆芯。 我无法在Linux上调试的原因是我没有Linux机器。该引擎在TCEC托管的176核linux机器上运行 我想获取已传递给getWDL(Board*Board)函数的Board*Board对象的内存表示形式 我们已收到TCEC管理员提供的以下信息 核心由“./Koivisto_

我和一个朋友写了一个国际象棋引擎,他参加了顶级国际象棋引擎锦标赛(TCEC)。尽管我们的引擎在一场被认为是失败的比赛中发生了故障,但我们还是在资格赛中排名第一。我确实了解C++编程的基本知识,但我一直坚持分析产生的堆芯。
我无法在Linux上调试的原因是我没有Linux机器。该引擎在TCEC托管的176核linux机器上运行

我想获取已传递给
getWDL(Board*Board)
函数的
Board*Board
对象的内存表示形式

我们已收到TCEC管理员提供的以下信息

核心由“./Koivisto_4.44-x64-linux-native”生成。
程序以信号SIGSEGV终止,分段故障。
#探测_表中的0 0x000000000040c039((匿名命名空间)::Pos const*,int,int*,int)()
[当前线程为1(LWP 3364456)]
(gdb)英国电信
#探测_表中的0 0x000000000040c039((匿名命名空间)::Pos const*,int,int*,int)()
#1 0x000000000040cb4f位于探测_ab((匿名命名空间)::Pos const*,int,int,int*)()
#2 0x000000000040cc56位于probe_wdl((匿名命名空间)::Pos*,int*)[clone.lto_priv.167]()
#getWDL中的3 0x0000000000411029(板*)[clone.part.11]()
#pvSearch中的4 0x0000000000419a71(Board*、short、short、unsigned char、unsigned char、ThreadData*、unsigned int、unsigned char*)()
#pvSearch中的5 0x000000000041a0f2(Board*、short、short、unsigned char、unsigned char、ThreadData*、unsigned int、unsigned char*)()
#pvSearch中的6 0x000000000041a52d(Board*、short、short、unsigned char、unsigned char、ThreadData*、unsigned int、unsigned char*)()
#pvSearch中的7 0x000000000041a52d(Board*、short、short、unsigned char、unsigned char、ThreadData*、unsigned int、unsigned char*)()
#pvSearch中的8 0x000000000041a0f2(Board*、short、short、unsigned char、unsigned char、ThreadData*、unsigned int、unsigned char*)()
(gdb)信息寄存器
rax 0xFFFFFFFFFA-6
rbx 0x7f66a8ff4a10 1400788988694672
rcx 0xb87 2951
rdx 0xe3b 3643
rsi 0xFFFFFFFF4294967295
rdi 0x6
rbp 0x7f6730006480 0x7f6730006480
rsp 0x7f66a8ff4790 0x7f66a8ff4790
r8 0x0 0
r9 0x0 0
r10 0x7fa7a81ee580 140358056863104
r11 0x7F6730006530140081163691312
r12 0x7
r13 0x17428d50 390237520
r14 0xfc00000000000000-28823037651711744
r15 0x7f67a80d504a 140083177803850
rip 0x40c039 0x40c039
eflags 0x10297[CF PF AF SF IF RF]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
│0x40c022 lea 0x1(%rdi),%r12d
│0x40c026 mov%rdi,0x28(%rsp)
│0x40c02b添加0x10(%rbp),%r10
│0x40c02f负%rax
│0x40c032 movslq%r12d,%r12
│0x40c035 mov 0x38(%rbp),%r14
>│0x40c039 movbe(%r10),%rsi
│0x40c03e lea 0x0(%rbp,%rax,8),%rbx
│0x40c043添加$0x8,%r10
│0x40c047 nopw 0x0(%rax,%rax,1)
│0x40c050 cmp%rsi,%r14
│0x40c053 jbe 0x40c0ce
需要注意的是,
probe_table,probe_ab,probe_wdl
并没有被我们实现,但它是一个库,基本上被任何国际象棋程序用来读取棋盘上最多7个棋子的表基文件

与此库相关的其他程序从未观察到崩溃。这就是为什么我认为我给
探测器的输入是错误的

getWDL(Board*Board)
函数如下所示:

Score getWDL(板*Board){
UCI_ASSERT(董事会);
//如果棋盘上的棋子太多,我们就无法证明这些表格
if(位计数(*线路板->getOccupiedBB())>(签名)TB\U最大值)
返回最大匹配分数;
//使用给定的文件,使用来自电路板的信息来证明表格。
无符号res=tb\U探测器\U wdl(
board->getTeamOccupiedBB()[WHITE],
board->getTeamOccupiedBB()[黑色],
board->getPieceBB()[WHITE_KING]| board->getPieceBB()[BLACK_KING],
棋盘->getPieceBB()[WHITE_QUEEN]|棋盘->getPieceBB()[BLACK_QUEEN],
线路板->getPieceBB()[WHITE_ROOK]|线路板->getPieceBB()[BLACK_ROOK],
董事会->getPieceBB()[WHITE_BISHOP]|董事会->getPieceBB()[BLACK_BISHOP],
棋盘->getPieceBB()[WHITE_KNIGHT]|棋盘->getPieceBB()[BLACK_KNIGHT],
棋盘->getPieceBB()[白棋子];棋盘->getPieceBB()[黑棋子],
board->GetCurrent50OveruleCount(),
董事会->获得投票权(0)|
董事会->获得投票权(1)|
董事会->获得投票权(2)|
董事会->获得投票权(3),
board->getEnPassantSquare()!=64?board->getEnPassantSquare():0,
board->getActivePlayer()=白色);
除上述信息外,我们还得到了一个大小约为2GB的不完整coredump。请注意,该程序的整个内存使用量约为100Gb,其中大部分内存用于索引搜索树中的某个哈希表,与调试无关

由于我从未使用过类似的东西,如果有人能帮助我并向我解释如何读取和解析核心转储,以提取存储在
Board*Board
中的信息,检查Board对象是否以及如何被更改,我将非常高兴

问候 芬兰人

编辑1 我的机器上有gdb
g++ -O3 -std=c++17 -Wall -Wextra -Wshadow -DNDEBUG -flto -march=native *.cpp syzygy/tbprobe.c -DMINOR_VERSION=50 -DMAJOR_VERSION=4 -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -DUSE_POPCNT -msse3 -mpopcnt -o ../bin/Koivisto_4.44-x64-linux-native.exe