相关疑难解决方法(0)

如何以编程方式在C/C++中导致核心转储

我想在我的C++应用程序中的特定位置强制执行核心转储.

我知道我可以做以下事情:

int * crash = NULL;
*crash = 1;
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更干净的方式?

我顺便使用Linux.

c c++ linux coredump abort

84
推荐指数
6
解决办法
7万
查看次数

对齐堆栈意味着什么?

我是一名高级程序员,架构对我来说很新,所以我决定在这里阅读有关Assembly的教程:

http://en.wikibooks.org/wiki/X86_Assembly/Print_Version

在教程的下方,有关如何转换Hello World的说明!程序

#include <stdio.h>

int main(void) {
    printf("Hello, world!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

进入等效的汇编代码并生成以下内容:

        .text
LC0:
        .ascii "Hello, world!\12\0"
.globl _main
_main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        call    __alloca
        call    ___main
        movl    $LC0, (%esp)
        call    _printf
        movl    $0, %eax
        leave
        ret
Run Code Online (Sandbox Code Playgroud)

对于其中一条线,

andl    $-16, %esp
Run Code Online (Sandbox Code Playgroud)

解释是:

这段代码"和"ESP与0xFFFFFFF0,使堆栈与下一个最低的16字节边界对齐.对Mingw源代码的检查表明,这可能是出现在"_main"例程中的SIMD指令,它只在对齐的地址上运行.由于我们的例程不包含SIMD指令,因此不需要此行.

我不明白这一点.有人能给我一个解释,说明将堆栈与下一个16字节边界对齐是什么意思以及为什么需要它?如何andl实现这一目标?

c assembly gcc

45
推荐指数
5
解决办法
2万
查看次数

C++为调试目的创建SIGSEGV

我正在开发一个无锁的共享变量类,我希望能够生成一个SIGSEGV错误,看看我的实现是否按照我的计划运行.我已经尝试创建一个修改指针并读取100次的函数.然后我在两个线程中调用此函数,并让线程在我的程序中无限运行.这不会产生我想要的错误.我应该怎么做呢?

编辑 我根本不处理段错误,但如果我删除了锁,它们就会在我的程序中生成.我想使用无锁设计,因此我创建了一个使用CAS保持无锁的共享变量类.有没有办法,我可以有一段代码,将生成段错误,以便我可以使用我的类来测试它解决了问题?

c++ multithreading segmentation-fault

5
推荐指数
2
解决办法
4455
查看次数

标签 统计

c ×2

c++ ×2

abort ×1

assembly ×1

coredump ×1

gcc ×1

linux ×1

multithreading ×1

segmentation-fault ×1