小编MrA*_*man的帖子

由 MATLAB MEX 函数中的“优化输出”值引起的 GCC 段错误

我正在尝试编写一个相当简单的递归洪水填充算法(作为 MATLAB mex 函数运行),但是在打开 GCC 中的优化标志时遇到了问题(如果重要的话,v 7.5.0)。代码在没有打开任何优化标志的情况下工作正常,但是当我使用 -O2 或 -O3 标志时会出现段错误。我已经将罪魁祸首缩小到一个被 GCC 优化的索引变量——如果我将它指定为一个易失性变量,即使在更高的优化级别上也不会发生段错误。我假设我必须使用未定义的行为,但我看不出这可能发生在哪里。

有问题的代码片段:

#include "mex.h"
#include <string.h>

//     Removing this causes the program to segfault -----v
void fill(double *image, signed int x, signed int n, volatile signed int i, double k)
{
    image[i] = k;
    if ((i-1) >= 0 && ((i-1) % x) < (i % x) && image[i-1]==1)
        fill(image,x,n,i-1,k);
    if ((i-x) >= 0 && image[i-x]==1)
        fill(image,x,n,i-x,k);
    if ((i+1) < n && ((i+1) % x) > (i % x) …
Run Code Online (Sandbox Code Playgroud)

c matlab gcc mex segmentation-fault

5
推荐指数
1
解决办法
78
查看次数

无法在 gdb 中禁用分页

我似乎无法在 gdb 中禁用分页。我已经阅读了所有建议添加set pagination offset height 0或添加set height unlimited到我的 ~/.gdbinit 文件的各种答案,并且我已经尝试了所有这些,但是 gdb 似乎忽略了所有这些。当我启动 gdb 时,它显然在读取 ~/.gdbinit 文件,因为我可以设置自动加载安全路径,但是每次启动时,我都必须再次按 Enter 才能启动 gdb,这非常令人沮丧. 就好像它只是完全忽略了分页关闭命令。我也尝试将这些命令添加到系统范围的 gdbinit(在/etc/gdb/gdbinit),但这也不起作用。

就其价值而言,我正在运行带有 GDB 版本的 Xubuntu 18.04 (GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git)。.gdbinit 文件当前读取:

set auto-load safe-path /
#set height 0
#set height unlimited
set pagination off
Run Code Online (Sandbox Code Playgroud)

编辑:为了澄清,出于各种原因,我必须让我的终端相当短(约 13 行左右)。当我启动 GDB 时,我会看到以下内容:

GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later …
Run Code Online (Sandbox Code Playgroud)

debugging gdb gdbinit

4
推荐指数
1
解决办法
733
查看次数

标签 统计

c ×1

debugging ×1

gcc ×1

gdb ×1

gdbinit ×1

matlab ×1

mex ×1

segmentation-fault ×1