小编roi*_*mon的帖子

/var/crash 中没有核心转储

我想了解一下核心转储是如何工作的。

我使用 test.c 文件生成核心转储:

#include <stdio.h>                                                              

void foo()                                                                      
{                                                                               
        int *ptr = 0;                                                           
        *ptr = 7;                                                               
}                                                                               

int main()                                                                      
{                                                                               
        foo();                                                                  
        return 0;                                                               
}
Run Code Online (Sandbox Code Playgroud)

我编译用

gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

当我运行 ./test 时,它给了我以下消息

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

我的档案

/proc/sys/kernel/core_pattern 
Run Code Online (Sandbox Code Playgroud)

包含:

|/usr/share/apport/apport %p %s %c %d %P
Run Code Online (Sandbox Code Playgroud)

我检查了我是否有写入该目录的权限

/var/crash/
Run Code Online (Sandbox Code Playgroud)

但在核心转储之后,该文件夹(/var/crash/)中没有任何内容。我使用的是 Linux 版本 17.04。你知道这里会出什么问题吗?

编辑

我忘了提及我设置了限制:

ulimit -c unlimited
Run Code Online (Sandbox Code Playgroud)

所以输出

ulimit -c
Run Code Online (Sandbox Code Playgroud)

内容如下:

unlimited
Run Code Online (Sandbox Code Playgroud)

我什至尝试按照他们在如何启用 apport部分中所说的进行操作,因此我在前面添加了一个井号

'problem_types': ['Bug', 'Package']
Run Code Online (Sandbox Code Playgroud)

但尽管如此,在 /var/cash 中找不到核心转储

linux coredump

6
推荐指数
1
解决办法
8992
查看次数

将函数转换为ac程序中的函数指针

我正在尝试了解轮胎压力监测系统的软件,但我对C语言知之甚少.在其中一个头文件中有这样的定义:

#define TPMS_RESET         gu16AddressToFn = u16fnDALLinkFmw(gu8Derivative, FN_RESET);\
                       ((void(*)(void))(gu16AddressToFn))

/* UINT8 TPMS_READ_VOLTAGE(UINT16 *u16UUMA) */
#define  TPMS_READ_VOLTAGE  ((UINT8(*)(UINT16*))(u16fnDALLinkFmw(gu8Derivative, FN_READ_VOLT)))

/* UINT8 TPMS_COMP_VOLTAGE(UINT8 *u8CompVoltage, *UINT16 u16UUMA) */
#define  TPMS_COMP_VOLTAGE  ((UINT8(*)(UINT8*, UINT16*))(u16fnDALLinkFmw(gu8Derivative, FN_COMP_V)))

/* UINT8 TPMS_READ_TEMPERATURE(UINT16 *u16UUMA) */
#define  TPMS_READ_TEMPERATURE  ((UINT8(*)(UINT16*))(u16fnDALLinkFmw(gu8Derivative, FN_READ_T)))

/* UINT8 TPMS_COMP_TEMPERATURE(UINT8 *u8Temp, UINT16 *u16UUMA) */
#define  TPMS_COMP_TEMPERATURE   ((UINT8(*)(UINT8*, UINT16*))(u16fnDALLinkFmw(gu8Derivative, FN_COMP_T)))

/* UINT8 TPMS_READ_PRESSURE(UINT16 *u16UUMA, UINT8 u8Avg) */
#define  TPMS_READ_PRESSURE    ((UINT8(*)(UINT16*, UINT8))(u16fnDALLinkFmw(gu8Derivative, FN_READ_P)))

/* UINT8 TPMS_COMP_PRESSURE(UINT16 *u16CompPressure, UINT16 *u16UUMA) */
#define  TPMS_COMP_PRESSURE    ((UINT8(*)(UINT16*, UINT16*))(u16fnDALLinkFmw(gu8Derivative, FN_COMP_P)))    

/* UINT8 TPMS_READ_ACCEL_X(UINT16 *u16UUMA, UINT8 u8Avg, …
Run Code Online (Sandbox Code Playgroud)

c casting

3
推荐指数
1
解决办法
63
查看次数

为什么lock_guard是一个模板?

我刚刚了解到std::lock_guard,我想知道为什么它是一个模板。
到目前为止我只见过尖括号内的std::lock_guard<std::mutex>with 。std::mutex

c++ concurrency mutex

2
推荐指数
1
解决办法
469
查看次数

std::map 上基于范围的循环迭代需要解释

以下代码运行正常

#include<iostream>
#include<map>
#include<algorithm>
#include<string>
#include<vector> using namespace std;

int main() {
    std::map<int, std::string> m;
    m[0] = "hello";
    m[4] = "!";
    m[2] = "world";
    for (std::pair<int, std::string> i : m)
    {
        cout << i.second << endl;
    }
    return 0; }
Run Code Online (Sandbox Code Playgroud)

但是,如果我将 for 循环替换为

for (std::pair<int, std::string>& i : m)
{
    cout << i.second << endl;
}
Run Code Online (Sandbox Code Playgroud)

不管用。我明白'initializing': cannot convert from 'std::pair<const int,std::string>' to 'std::pair<int,std::string> &' 但是,

for (auto& i : m)
{
    cout << i.second << endl;
}
Run Code Online (Sandbox Code Playgroud)

正在工作,而且如果我执行以下操作 …

c++ range-based-loop

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

在堆上分配指针的原因是什么?

可能这个问题已经被问过,但我找不到。如果您看到什么,请重定向我。 问题: 使用有什么好处:

myClass* pointer;
Run Code Online (Sandbox Code Playgroud)

超过

myClass* pointer = new(myClass);
Run Code Online (Sandbox Code Playgroud)

通过阅读其他主题,我了解到第一个选项在堆栈上分配一个空间并使指针指向它,而第二个选项在堆上分配一个空间并使指针指向它。但我还读到,第二个选项很乏味,因为您必须通过删除来释放空间。那么为什么人们会使用第二种选择呢?我是个菜鸟所以请详细解释。

编辑

#include <iostream>

using namespace std;

class Dog
{
        public:
                void bark()
                {
                        cout << "wouf!!!" << endl;
                }

};


int main()
{

        Dog* myDog = new(Dog);
        myDog->bark();
        delete myDog;
        return 0;

}
Run Code Online (Sandbox Code Playgroud)

#include <iostream>

using namespace std;

class Dog
{
        public:
                void bark()
                {
                        cout << "wouf!!!" << endl;
                }

};


int main()
{

        Dog* myDog;
        myDog->bark();
        return 0;

}
Run Code Online (Sandbox Code Playgroud)

两者都编译并给我“wouf!!!”。那么为什么我应该使用“new”关键字呢?

c++ pointers class dynamic-memory-allocation static-memory-allocation

-1
推荐指数
1
解决办法
1227
查看次数

ARM 与 RISC 以及 x86 与 CISC

通过一些研究,我意识到 ARM 和 RISC 几乎可以互换使用,x86 和 CISC 也是如此。我理解RISC和CISC是架构。我的理解是,架构(即 RISC 或 CISC)是一种指令集,进程必须能够执行这些指令才能成为这些架构之一。例如,RISC-V 有一个它可以执行的指令列表,CISC 有一个它可以执行的指令列表。要成为 RISC 或 CISC,处理器必须能够执行特定的指令列表之一。但是,我不明白ARM和RISC以及x86和CISC分别有什么区别。ARM和x86不也是架构吗?我经常读到“ARM 架构”或“x86 架构”。感谢您为我澄清这一点。

x86 arm cpu-architecture risc

-1
推荐指数
2
解决办法
2479
查看次数