分段错误(核心转储),不知道原因
Segmentation Fault(Core dump), Do not know why
我试图为某些分布式应用程序编造一个代码以查看其工作情况,但是我遇到了错误。我正在尝试查看消息的工作
代码是
class Address {
public:
char addr[6];
Address() {}
Address(string address) {
size_t pos = address.find(":");
int id = stoi(address.substr(0, pos));
short port = (short)stoi(address.substr(pos + 1, address.size()-pos-1));
memcpy(&addr[0], &id, sizeof(int));
memcpy(&addr[4], &port, sizeof(short));
}
};
enum MsgTypes{
JOINREQ,
JOINREPLY,
DUMMYLASTMSGTYPE,
HEARTBEAT
};
/**
* STRUCT NAME: MessageHdr
*
* DESCRIPTION: Header and content of a message
*/
typedef struct MessageHdr {
enum MsgTypes msgType;
}MessageHdr;
typedef struct en_msg {
// Number of bytes after the class
int size;
// Source node
Address from;
// Destination node
Address to;
}en_msg;
void send(Address *myaddr, Address *toaddr, char *data, int size);
int main()
{
MessageHdr *msg;
size_t msgsize = sizeof(MessageHdr) + sizeof(Address) + sizeof(long) + 1;
int id=233;
short port =22;
long heartbeat=1;
string s=to_string(id)+to_string(port);
string s1=to_string(id+1)+to_string(port+1);
Address *addr= new Address(s);
Address *toaddr= new Address(s);
msg->msgType = JOINREQ;
memcpy((char *)(msg+1), addr, sizeof(addr));
memcpy((char *)(msg+1) + 1 + sizeof(addr), (char *)heartbeat, sizeof(long));
send(addr, toaddr, (char *)msg, msgsize);
}
void send(Address *myaddr, Address *toaddr, char *data, int size) {
en_msg *em;
static char temp[2048];
em = (en_msg *)malloc(sizeof(en_msg) + size);
em->size = size;
memcpy(&(em->from), &(myaddr), sizeof(em->from));
memcpy(&(em->to), &(toaddr), sizeof(em->from));
memcpy(em + 1, data, size);
cout<<em;
}
错误只是这一行:
分段故障(核心转储(
1(正如退休忍者在评论中所说,main
的第一行必须像
MessageHdr *msg = new MessageHdr();
因为msg->msgType = JOINREQ;
会导致未分配msg
错误。
2(第一个修复将无济于事,因为诸如
(char *)(msg+1)
这里msg
类型MessageHdr *
用作地址算术中的char *
。我的意思是,通过风格表达来计算地址是危险的
(char *)(msg+1) + 1
虽然msg
是MessageHdr*
类型,但(msg+1)
- 表示移动到下一个结构MessageHdr
,而转换为char*
后的额外+1
意味着移动到一个字节。我个人无法理解逻辑,而MessageHdr
结构只有一个enum
字段,并且通过如此奇怪的地址操作,您正在尝试将Address
类(或long int
值(的实例与该结构配合memcpy
。
结论:
需要非常大量的程序重新设计,编写注释并在操作中使用清晰的逻辑。
相关文章:
- 我不知道为什么这段代码会让核心被转储?
- WinDbg 不显示某些小型转储文件的完整堆栈跟踪
- 如何保护非托管应用程序中的字符串不受进程转储的影响
- 分段故障(核心转储)-不知道为什么
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 为什么在使用字符指针 str1 而不是 str 时会出现分段转储?
- 标准::地图使用.这是怎么回事?核心转储?我做得不正确?
- 是否可以以编程方式创建迷你转储文件而不会崩溃?
- 在用GDB调试核心转储时,知道谁是继承者
- QT应用程序崩溃但不容易复制,我捕获了转储堆栈以及如何通过堆栈找到源代码
- 分段错误(核心转储) - 代码在 VS 中有效,但在 Linux 终端中不起作用
- C++ 中的分段错误(核心转储) 找不到错误
- 分段错误(核心转储),不知道原因
- C++-CString不确定为转储html源设置什么值
- 为什么这个c++程序不处理异常并为负数提供核心转储
- 小型转储单元测试不返回 true
- G++ 转储的程序集输出不起作用
- 学习指针C++使用以下代码进入核心转储,我真的不知道为什么?
- 用于分析故障转储的 WinDbg 在本地电脑上不起作用
- 核心转储?我已经通过我的程序很多次不知道出了什么问题