增大栈空间后C++程序出现SIGBUS错误的排查与解决
问题描述
我是C++初学者,需运行递归代码处理超大输入。最初程序报SIGSEGV错误,判断是栈空间不足,遂在CLion的CMakeLists.txt中添加set(CMAKE_EXE_LINKER_FLAGS "-Wl,-stack_size,0x20000000"),但现在出现SIGBUS错误(被信号10中断:SIGBUS)。
我的代码是二维网格的DFS实现:
void dfs(int x, int y) { if (vis[x][y]) { return; } vis[x][y] = 1; if (!useless[x][y]) { int cnt_ok = 0; for (int d = 0; d < 4; ++d) { int nx = x + dx[d]; int ny = y + dy[d]; if (valid(nx, ny)) { cnt_ok += !useless[nx][ny]; } } useless[x][y] = cnt_ok < 2; } for (int d = 0; d < 4; ++d) { int nx = x + dx[d]; int ny = y + dy[d]; if (valid(nx, ny)) { dfs(nx, ny); } } }
其中valid()用于校验坐标合法性,dx[4] = {-1, 1, 0, 0},dy[4] = {0, 0, 1, -1},vis和useless向量尺寸与网格一致。
调试时错误出在DFS函数定义行(62行)和递归调用行(86行)。处理大输入时电脑卡顿,小输入运行正常;注释掉if (!useless[x][y])后,大输入也能正常运行。
解决更新
已解决,将栈大小调整为0x40000000后程序运行正常。(此前因先出现SIGSEGV错误,误以为栈空间足够,未料到SIGBUS也由栈空间不足导致)
内容的提问来源于stack exchange,提问作者MangoPizza
相关产品推荐
相关产品推荐

