运行时出现段错误

来源:互联网 发布:田岛美工刀片成都代理 编辑:程序博客网 时间:2024/04/29 08:37
编译通过,运行时出现段错误

产生段错误是因为访问了错误的内存段,一般是你没有权限(这句话很重要),或者根本就不存在对应的物理内存,尤其常见的是访问0地址.

    通常,段错误就发生在访问的内存超出了系统所给程序的内存空间,这个值是由gdtr来保存的,它是一个48位的寄存器,其中的32位保存由它指向的gdt表,后 13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访问,cpu 就会产生相应的异常保护,于是segmentation fault就出现了.

在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的

1)访问系统数据区,尤其是往 系统保护的内存地址写数据
   最常见就是给一个指针以0地址
2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域


然而,在程序完全正确的情况下仍有错误,是因为linux中用户权限问题!改成root用户后即可运行成功!!

程序代码如下(网络编程技术及应用):

#ifdef _cplusplus
extern "C" {
#endif
#include <pcap.h>
#ifdef _cplusplus
}
#endif

void printer(u_char * user,const struct pcap_pkthdr * h,const u_char * p)
{
        printf("i get one packet! ");
}


#define DEFAULT_SNAPLEN 68
int main()
        {
                char ebuf[PCAP_ERRBUF_SIZE];
                char *device=pcap_lookupdev(ebuf);

                bpf_u_int32 localnet, netmask;
                pcap_lookupnet(device, &localnet, &netmask, ebuf);

                printf("%u.%u.%u.%u", localnet&0xff, localnet>>8&0xff,
                localnet>>16&0xff, localnet>>24&0xff);
                printf(":%d.%d.%d.%d ", netmask&0xff, netmask>>8&0xff,
                netmask>>16&0xff, netmask>>24&0xff);

                pcap_t *pd;
                pd= pcap_open_live(device, DEFAULT_SNAPLEN, 0, 1000, ebuf);
                    //if(pcap_datalink(pd) == DLT_EN10MB)
                //printf("10Mb以太网 ");

                struct bpf_program fcode;
                pcap_compile(pd, &fcode, NULL,1 ,0 );

                pcap_setfilter(pd, &fcode);

                pcap_loop(pd, 10, printer, NULL);

                struct pcap_stat stat;
                pcap_stats(pd, &stat);
                printf("recv %d, drop %d. ", stat.ps_recv, stat.ps_drop);

                pcap_close(pd);
                }
 
原创粉丝点击