我想了解一下核心转储是如何工作的。
我使用 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 中找不到核心转储
我正在尝试了解轮胎压力监测系统的软件,但我对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) 我刚刚了解到std::lock_guard,我想知道为什么它是一个模板。
到目前为止我只见过尖括号内的std::lock_guard<std::mutex>with 。std::mutex
以下代码运行正常
#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)
正在工作,而且如果我执行以下操作 …
可能这个问题已经被问过,但我找不到。如果您看到什么,请重定向我。 问题: 使用有什么好处:
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
通过一些研究,我意识到 ARM 和 RISC 几乎可以互换使用,x86 和 CISC 也是如此。我理解RISC和CISC是架构。我的理解是,架构(即 RISC 或 CISC)是一种指令集,进程必须能够执行这些指令才能成为这些架构之一。例如,RISC-V 有一个它可以执行的指令列表,CISC 有一个它可以执行的指令列表。要成为 RISC 或 CISC,处理器必须能够执行特定的指令列表之一。但是,我不明白ARM和RISC以及x86和CISC分别有什么区别。ARM和x86不也是架构吗?我经常读到“ARM 架构”或“x86 架构”。感谢您为我澄清这一点。