在进入 main() 之前出现分段错误 [关闭]

Posted

技术标签:

【中文标题】在进入 main() 之前出现分段错误 [关闭]【英文标题】:I get a segmentation fault before entering main() [closed] 【发布时间】:2011-11-10 10:18:27 【问题描述】:

有人知道我的代码有什么问题吗?

这些是我包含的库:

#include <pthread.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <stdio.h>

using namespace std;

int sockfd;

这是我的send 命令线程:

void *mySend(void* a)
 
    cout<<"me too"<<endl;
        //this cout is not printed.

    char message[100];

    while (1)
     
         cin>>message;
    send(sockfd, message, strlen(message)+1, 0);
    
    return NULL;    

 

我的 main 函数将此代码连接到服务器,并具有用于从服务器接收的recv 命令。

 int main(int argc, char *argv[])
 
     cout << "hello" << endl;
     //this cout is not printed
 int port;

     cout << "hello" << endl;

     sscanf(argv[3],"%d", & port);

 cout << "hello" << endl;

 struct sockaddr_in dest_addr;
     sockfd = socket(AF_INET,SOCK_STREAM,0);
     dest_addr.sin_family = AF_INET;
     dest_addr.sin_port = htons(port);
     dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
     memset(&(dest_addr.sin_zero),'\0',8);

     int c = connect (sockfd,(struct sockaddr *)&dest_addr,sizeof(structsockaddr));
     if (c!=-1)
         cout <<"CONNECTED SUCCESSFULLY!"<<endl;

 char buffer [20];
 pthread_t mammad;
 pthread_create (&mammad, NULL,mySend,0);   

对于recv 命令。

     while(1)
 
     recv (sockfd , buffer , strlen(buffer)+1 , 0 );
     cout <<"server said :" <<buffer<<endl;
  
 close (sockfd);
 return 0;

 

在打印任何内容之前出现分段错误。 我就是想不通。 帮忙!

【问题讨论】:

您是否尝试过使用调试器来获取崩溃时的回溯和位置? 我强烈建议在访问argv 之前检查argc。例如,在你的情况下if (argc &lt; 4) cout &lt;&lt; "not enough args"; return -1; sscanf(argv[3],"%d", &amp; port); 你有静态或全局声明吗? 遵循通常的调试策略:删除东西直到问题消失。您删除的最后一件事一定是问题的一部分。在寻求帮助时发布最少可编译代码。 【参考方案1】:

您以何种方式提供意见。

如果是这样的

$./a.out PORT_NO

那么你肯定会得到隔离。因为你使用的是 argv[3]

如果你为 argv[1] 这样做,它肯定会运行

我已经测试过了。

输出如下......

[sharma@localhost ~]$ ./a.out 5000
hello
hello
5000
hello
CONNECTED SUCCESSFULLY!
me too
server said :W
server said :el
server said :com
server said :e to�H*����
server said : TCPServer����
me too
me too
me too
me too
me too
It's a test
server said :No one on that ro
me too
server said :le.No one on that 
server said :role. one on that 
me too
me too

哦...发送和接收已损坏。因为我在 recv while 循环中使用了您的 pthread。

【讨论】:

【参考方案2】:

如果程序在输入main 之前崩溃了,那一定是一些初始化的东西崩溃了。你应该看看你的全局对象和它们的构造函数。这样做时请记住,如果全局对象 1 依赖于已构建的全局对象 2,您可能会遇到问题。

【讨论】:

臭名昭著的Static Initialization Fiasco

以上是关于在进入 main() 之前出现分段错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥写作主要;在 C 中给出一个段错误

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

带有 std::promise 的 C++11 分段错误

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

当我调用jmp时,我在c内联汇编中出现了段错误

这段代码一次执行良好,另一次出现分段错误