帮忙分析FreeBSD下C函数堆栈出错!
时间:2010-08-17
来源:互联网
最近在开发碰到函数栈出错的问题,折腾了几下,发现根本没有找到突破口,有没有哪位能够指点思路,顺便介绍几本Unix下汇编语言学习的书籍?
运行平台:FreeBSD 7.0 x86-64 多核
出错情况:获取hash表对应节点指针时在被调用函数内部是正确的,但是到调用函数内部就不一样啦!
代码如下:
vpn_clientip_t *global_clientip = NULL;
vpn_clientip_t *
vpn_clientip_lookup_hash(uint32_t ip)
{
uint32_t index;
vpn_clientip_t *clientip;
index = vpn_clientip_get_hash_key(ip);
TAILQ_FOREACH(clientip, &(vpn_clientip_hash_table[index].clientip_list), next_clientip) {
vpn_log("lookup index 0x%08X clientip %p ip %s",
index, clientip, vpn_ntoa(clientip->vc_ip));
if (ip == clientip->vc_ip) {
global_clientip = clientip;
return clientip;
}
}
return NULL;
}
int
vpn_local_input(struct mbuf *m, vpn_tunnel_t **vt)
{
struct ip *ipp;
vpn_clientip_t *clientip;
vpn_tunnel_t *vpn_tunnel;
uint32_t ipaddr;
ipp = mtod(m, struct ip *);
ipaddr = (uint32_t)ipp->ip_dst.s_addr;
clientip = vpn_clientip_lookup_hash(ipaddr);
if (clientip == NULL) {
vpn_log("data from %s can't find a tunnel", vpn_ntoa(ipaddr));
amp_mfreem(m);
return -1;
}
if (clientip != global_clientip) {
vpn_log("clientip %p global_clientip %p", clientip, global_clientip);
clientip = global_clientip;
}
vpn_tunnel = clientip->vc_tunnel;
...;
return 0;
}
其中global_clientip是为了解决这个问题临时加的一个全局变量,通过全局变量来传递指针是没有问题,我只是纳闷哪里出了问题!
希望得到大家的指点!
运行平台:FreeBSD 7.0 x86-64 多核
出错情况:获取hash表对应节点指针时在被调用函数内部是正确的,但是到调用函数内部就不一样啦!
代码如下:
vpn_clientip_t *global_clientip = NULL;
vpn_clientip_t *
vpn_clientip_lookup_hash(uint32_t ip)
{
uint32_t index;
vpn_clientip_t *clientip;
index = vpn_clientip_get_hash_key(ip);
TAILQ_FOREACH(clientip, &(vpn_clientip_hash_table[index].clientip_list), next_clientip) {
vpn_log("lookup index 0x%08X clientip %p ip %s",
index, clientip, vpn_ntoa(clientip->vc_ip));
if (ip == clientip->vc_ip) {
global_clientip = clientip;
return clientip;
}
}
return NULL;
}
int
vpn_local_input(struct mbuf *m, vpn_tunnel_t **vt)
{
struct ip *ipp;
vpn_clientip_t *clientip;
vpn_tunnel_t *vpn_tunnel;
uint32_t ipaddr;
ipp = mtod(m, struct ip *);
ipaddr = (uint32_t)ipp->ip_dst.s_addr;
clientip = vpn_clientip_lookup_hash(ipaddr);
if (clientip == NULL) {
vpn_log("data from %s can't find a tunnel", vpn_ntoa(ipaddr));
amp_mfreem(m);
return -1;
}
if (clientip != global_clientip) {
vpn_log("clientip %p global_clientip %p", clientip, global_clientip);
clientip = global_clientip;
}
vpn_tunnel = clientip->vc_tunnel;
...;
return 0;
}
其中global_clientip是为了解决这个问题临时加的一个全局变量,通过全局变量来传递指针是没有问题,我只是纳闷哪里出了问题!
希望得到大家的指点!
作者: cheng0201 发布时间: 2010-08-17
难道是溢出,我不太确定你返回局部变量会不会有问题,不过一般我们都喜欢用static局部变量来返回(非多线程的时候),实在不行你也用吧.
希望楼主再贴点详细信息,例如怎么错了,错的情况是什么?
希望楼主再贴点详细信息,例如怎么错了,错的情况是什么?
作者: blackuhlan 发布时间: 2010-08-17
UNIX下汇编学习书籍推荐《Professional Assembly Language》,马朝晖也翻译过,中文名叫做《汇编语言程序设计》,认作者就行了
作者: daybreakcx 发布时间: 2010-08-17
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28