如何解决“分段故障(核心转储)”

时间:2014-03-08 12:33:32

标签: libpcap

这是我的代码:

#include<stdio.h>
#include<pcap.h>

void pcapdump(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char*   packet_content);

int main()
{
    int i=0, devid,ret;
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    bpf_u_int32 mask;
    bpf_u_int32 net;
    int num_packets=500;
    pcap_dumper_t *p;
    pcap_if_t *alldevs;
    pcap_if_t *pdev; 
    const struct pcap_pkthdr *packet_header;
    const u_char *packet_content;

    ret=pcap_findalldevs(&alldevs,errbuf);
    if(ret=-1)
    {
        printf("%s",errbuf);
    };

    for (pdev = alldevs;pdev;pdev=pdev->next)  
        printf("#%d: %s %s %s\n",++i,pdev->name,pdev->description,pdev->description);

    printf("select a device: "); 
    scanf("%d", &devid);  
    pdev=alldevs; 
    while (--devid)
    pdev=pdev->next;  
    printf("Selected %s \n", pdev->name);  


   if (pcap_lookupnet(pdev->name,&net,&mask,errbuf)==-1)
   {
        printf("Couldn't get netmask for device %s: %s\n", pdev->name, errbuf);
        net = 0;
        mask = 0;
    };

    handle=pcap_open_live(pdev->name,BUFSIZ,1,0,errbuf);
    printf("Number of packets: %d\n", num_packets);
    pcap_dump_open(handle,"/home/jiangzhongbai/capturefiles/10.pcapng");
    pcap_loop(handle,num_packets,pcap_dump,NULL);
    pcap_dump_close(p);
    pcap_freealldevs(alldevs); 
    pcap_close(handle);
    printf("\nCapture complete.\n");
    return 0;
}

结果是

  • eth0(null)(null)
  • wlan0(null)(null)
  • nflog Linux netfilter log(NFLOG)接口Linux netfilter log(NFLOG)接口
  • nfqueue Linux netfilter队列(NFQUEUE)接口Linux netfilter队列(NFQUEUE)接口
  • 任何在所有接口上捕获的伪设备在所有接口上捕获的伪设备
  • lo(null)(null)

选择一个设备:2 选择了wlan0 包数:500 分段错误(核心转储)

我认为functionpcap_dump_open有问题。但我不知道如何解决Segmentation fault(core dumped)的问题。请帮帮我。

1 个答案:

答案 0 :(得分:0)

  

如何解决分段错误(核心转储)

  1. 如果pcap_findalldevs()返回-1,请不要打印错误消息退出,因为alldevs并非必须设置为有效值或NULL

  2. 不要认为pdev->description是非空的 - 只有在它为非空时才打印出来。

  3. pcap_dump_open()的结果分配给变量p

  4. p而不是NULL作为pcap_loop()的第四个参数。