运行时出现段错误
来源:互联网 发布:田岛美工刀片成都代理 编辑:程序博客网 时间: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);
}
产生段错误是因为访问了错误的内存段,一般是你没有权限(这句话很重要),或者根本就不存在对应的物理内存,尤其常见的是访问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);
}
- 运行时出现段错误
- gcc编译通过,但运行程序出现段错误
- ROS 运行rqt rqt_graph出现段错误(核心已转储) 解决方法
- 使用strcat时出现段错误
- linux编译pam时出现段错误
- 运行时出现404错误
- linux中C程序运行时怪异的段错误--linux中因栈空间不足而出现的运行时段错误
- effective c++运行时错误出现错误
- linux下运行程序后出现段错误的原因和解决案例
- linux下运行程序后出现段错误的原因和解决案例
- Linux下运行C++程序出现“段错误(核心已转储)”的原因
- mysql的多线程安全问题:在mysql_real_connect时出现段错误。
- 多线程使用pycurl时出现段错误(segmentation fault)
- android出现段错误时的查找定位的方法
- 运行ASP时出现Automation错误解决方法!
- 计算机出现运行时错误,计数器出问题
- javascript innerHTML出现未知运行时错误
- Erlang程序运行时 出现错误原因
- IBM Rational Robot
- BMW 品牌历史
- 接口 & 抽象类
- SQL Server 6.5升级到SQL SERVER 2000
- 在Tomcat5.0环境下配置Servlet方法
- 运行时出现段错误
- 文件和文件组
- PetShop4.0架构分析
- 基于Extjs的相册系统设计
- tomcat连接池的配置
- EOBD的模糊概念
- excel设置密码
- 抄近路上谷歌 — 谷歌最简网址 G.cn 上线
- 《汽车文化》形成性考核