我如何在gdb中调试这个SIGSEV?

我如何在gdb中调试这个SIGSEV?,gdb,qnx,Gdb,Qnx,我正在构建以前的工作代码,但我遇到了seg故障,我无法找出哪里出了问题。gdb捕捉到错误,但它没有指出明显的原因。它显示的源代码行是一个函数名,因此它甚至没有进入函数。如果我看指令的分解,它仍然在设置堆栈,所以堆栈可能是乱七八糟的。那么我应该如何调试它呢?这在QNX 6.2中,仅限于控制台gdb 0x0816b829 in __ml (this=0x79b963c, anMultiplier=0) at ../u_matrix.cpp:56 56 tcMatrix tcMatrix::

我正在构建以前的工作代码,但我遇到了seg故障,我无法找出哪里出了问题。gdb捕捉到错误,但它没有指出明显的原因。它显示的源代码行是一个函数名,因此它甚至没有进入函数。如果我看指令的分解,它仍然在设置堆栈,所以堆栈可能是乱七八糟的。那么我应该如何调试它呢?这在QNX 6.2中,仅限于控制台gdb

0x0816b829 in __ml (this=0x79b963c, anMultiplier=0) at ../u_matrix.cpp:56
56      tcMatrix tcMatrix::operator*(float64 anMultiplier)

0x816b820 <__ml>:       push   %ebp
0x816b821 <__ml+1>:     mov    %esp,%ebp
0x816b823 <__ml+3>:     sub    $0x13ac,%esp
0x816b829 <__ml+9>:     push   %edi
0x816b82a <__ml+10>:    push   %esi
0x816b82b <__ml+11>:    push   %ebx 
0x0816b829英寸(此=0x79b963c,An乘数=0)位于../u矩阵处。cpp:56
56 tcMatrix tcMatrix::运算符*(浮点乘法器)
0x816b820:推送%ebp
0x816b821:mov%esp,%ebp
0x816b823:sub$0x13ac,%esp
0x816b829:推送%edi
0x816b82a:推送%esi
0x816b82b:推送%ebx

如果在gdb中执行“bt”,任何相关操作?

您也可以尝试对其进行valgrind'ing,这可以提供更多信息。

“this”指针看起来很混乱-0x79b963c似乎已关闭,但这可能取决于对象的初始化方式。试一试

打印这个

看看数据是否有意义或者是垃圾。看起来您的源代码与可执行文件不匹配-示例中的行看起来像是运算符重写声明,而不是可执行文件

我会忽略这一行,在源代码中查找整个_ml函数,并尝试打印一些局部变量,看看您是否在一个循环中,或者在某个其他范围内拥有它们

我猜你有一个矩阵乘法运算符,其中一个矩阵乘以一个浮点数-很可能这类似于索引越界,被一个超出内存范围并损坏堆栈的某种问题关闭


就像Unknown所说的,也可以尝试bt-如果它返回大量的???(),那么您的堆栈确实已损坏。

您正在崩溃的指令是
push%edi

这很可能意味着堆栈溢出

堆栈溢出的一个可能原因是无限递归。如果
(gdb)其中
显示了无休止的函数调用流,那就是您的问题

如果
其中
显示了合理的调用顺序,则重复执行
info frame
up
,查找大小不合理的帧


最后,问题可能是由执行环境中的更改引起的,而不是由程序中的任何内容引起的。我不确定QNX与
ulimit-s
的等价物是什么,但可能是堆栈限制太小了。

下面是我的答案:

ulimit-s在QNX上工作,但默认情况下是无限的

我会尝试

ldrel-S2M-L您的可执行名称


调整初始堆栈分配/延迟,以查看coredumps是否再次发生。您还可以使用QCC的-N标志将初始堆栈大小设置得更高。

QNX
现在似乎支持
valgrind
(至少从6.5开始):


Valgrind什么时候开始支持QNX了?哎呀,我错了,很抱歉,其他回答也不一定跟在问题后面(在gdb中),+1来反对否决票。