+ -
当前位置:首页 → 问答吧 → 帮忙分析FreeBSD下C函数堆栈出错!

帮忙分析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是为了解决这个问题临时加的一个全局变量,通过全局变量来传递指针是没有问题,我只是纳闷哪里出了问题!
希望得到大家的指点!

作者: cheng0201   发布时间: 2010-08-17

难道是溢出,我不太确定你返回局部变量会不会有问题,不过一般我们都喜欢用static局部变量来返回(非多线程的时候),实在不行你也用吧.
希望楼主再贴点详细信息,例如怎么错了,错的情况是什么?

作者: blackuhlan   发布时间: 2010-08-17

UNIX下汇编学习书籍推荐《Professional Assembly Language》,马朝晖也翻译过,中文名叫做《汇编语言程序设计》,认作者就行了

作者: daybreakcx   发布时间: 2010-08-17