崩溃正常,但没有GDB?

时间:2011-09-21 22:13:06

标签: crash gdb segmentation-fault

我的程序在正常运行时因分段错误而崩溃。所以我用gdb运行它,但是当我这样做时它不会崩溃。有谁知道为什么会这样?我知道Valgrind的faq提到了这一点(并没有在valgrind下崩溃),但我真的找不到与谷歌中的gdb相关的任何内容。如果有人能告诉我原因,或者在发生这种情况时建议寻找一些东西,我将非常感激。

9 个答案:

答案 0 :(得分:15)

我之前曾经遇到过这种情况(你并不孤单),但我不记得我做了什么来解决问题(我认为它是免费的双倍)。< / p>

我的建议是设置环境以创建核心转储,然后在程序崩溃后使用GDB调查核心转储。在bash中,这是使用ulimit -c size完成的,其中 size 可以是任何内容;我个人使用50000最大25MB;单位增量为512字节。

您可以使用GDB通过gdb program core来调查核心转储。

答案 1 :(得分:7)

听起来像Heisenbug你在那里: - )

如果您正在使用的平台能够生成核心文件,则应该可以使用核心文件和gdb来查明程序崩溃的位置 - 可以找到简短的解释here

让它崩溃几次,当崩溃是由堆栈粉碎或可变覆盖造成的时,这个bug似乎“走来走去”。

答案 2 :(得分:3)

好吧,我将其追踪到pthread_detach电话。我正在做pthread_detach(&amp; thethread)。我只是拿走了引用并将其更改为pthread_detach(thethread)并且它工作正常。我不是肯定的,但也许它是双重免费的,通过分离引用,然后当它超出范围时再次销毁它?

答案 3 :(得分:2)

尝试在gdb中附加到正在运行的进程,继续,然后再现崩溃。换句话说,不要在gdb内启动该程序;相反,正常启动程序然后attach <pid>

有时单独踩行时,会导致程序崩溃的竞争条件不会显现,因为种族危险已被消除或者步骤之间的“冗长”暂停非常不可能。

答案 4 :(得分:1)

检查pthread_detach来电的返回值。根据{{​​3}},您可能会将无效的线程句柄传递给pthread_detach

答案 5 :(得分:0)

如果bug取决于时间,gdb可能会阻止它重复。

答案 6 :(得分:0)

我也曾经发生过这种情况。

我的解决方案:清洁&amp;重建一切。

不是说这总能解决所有问题(在OP的情况下,问题是真的错误),但是如果你真的遇到这样的问题,你可以省去一些麻烦和时间奇怪的“元”错误。至少根据我的经验,这些事情往往来自应该重建但未重建的旧目标文件。在MinGW和常规GCC中。

答案 7 :(得分:0)

我遇到了类似的问题,在我的情况下,它连接到我的链表数据结构中的指针。当我动态创建一个新列表而没有初始化结构中的所有指针时,我的程序在GDB

之外崩溃

以下是我的原始数据结构:

typedef struct linked_list {
    node *head;
    node *tail;
} list;

typedef struct list_node {
    char *string;
    struct list_node *next;
} node;

当我创建一个新的&#34;实例&#34;一个list指定其headtail程序在DGB之外崩溃:

list *createList(void) {
    list *newList = (list *) malloc(sizeof(list));
    if (newList == NULL) return;

    return newList;
}

createList功能更改为此后,一切都开始正常工作:

list *createList(void) {
    list *newList = (list *) malloc(sizeof(list));
    if (newList == NULL) return;

    newList->head = (node *) 0;
    newList->tail = (node *) 0;

    return newList;
}

希望它可能对某些人有所帮助,如果我的例子与非初始化指针类似。

答案 8 :(得分:-3)

使用gdb运行代码时,它会被移动。现在你试图引用的非法地址 - 导致段错误的地址 - 突然变得合法。这肯定是一种痛苦。但我知道追踪这种错误的最好方法是开始在所有地方放入printf(),逐渐缩小它。