奇怪的__一调用函数_程序就会段错误而挂掉__的问题

尼再采 发布于 2014/01/17 14:28
阅读 1K+
收藏 1

前两天,我用C 写了一个动态库,给上层python程序调用,而且写了一个小测试的例子,并且循环1024次测试也通过。然后我心想着就准备部署到项目中去了,谁知道一部署到项目中,有一个接口一运行就会挂掉。 我就很奇怪了,相同的库,相同的接口,封装的python调用也一样,传入的数据也一样,而且是同一台机器。群里求助,有大虾说让我自己调试跟踪,好吧,我就跟踪啊跟踪,终于,跟踪到一个函数了,就在那里挂掉的。原项目程序比较复杂些,贴出来还不如我直接抽象出来模型,因此为了理解方便,我下面模拟一下场景,以例子来展述:

#define LOGPOS() do { LOGI("POS: %s(%d){%s}\n", __FILE__, __LINE__, __func__); } while(0)



a.c文件中

void A() {

    int m = 0;

    char * data = "abcd";

    int len = strlen(data);

    int ret_len = 0;

    LOGPOS(); //logA1

    char * ret1 = B(NULL, 1, &ret_len);

    LOGPOS();//logA2

    char * ret2 = B(data, len, &ret_len);

    LOGPOS(); //logA3

}



b.c文件

char * B(char *data, int len, int *ret_len) {

     LOGPOS(); //logB1

    if (data == NULL) {

        return NULL;

    }

    LOGPOS(); //logB2

    ...//一系列处理

}



程序执行的结果情况是:会打印:

logA1

logB1

logB2

logA2

//logB1 没打印出来

//logB2 没打印出来

//logA3 没打印出来

很奇怪的调用错误,第二次执行B()的时候就会段错误,而且B()中的logB1也没打印。

另外,我又写了一个B2函数,参数和返回类型都跟B()方法一致,但是函数是直接返回NULL的,然后传入同样的参数,调用此B2方法,依然没问题。

这到底是哪里出的问题?大概是什么样的奇怪问题,我排查了一上午确定问题就在这里,可是却这么奇怪?我找了个比较有经验的朋友问,他让我打印出传入参数的二进制,打印出来后也是没有头绪。。。

故来请教一下各路高手,不奢求解决方案,给个方向也行,我实在是没招了。。。。

加载中
0
嘿哟传说
嘿哟传说

有没有在c里面获取GIL这个玩意,python调用C代码,C代码需要做的第一件事就是获取GIL! try it!

嘿哟传说
嘿哟传说
回复 @尼再采 : 不管怎么样,都要获取GIL
尼再采
您的意思是跟多线程有关系吗?我在项目中只调用一次,目前没做多线程测试呢
0
sToa
sToa

B2中逐步加入B中的代码,定位到出错的那行再说

这种问题最好还是单步跟踪调试,找到产生无效地址的代码

返回顶部
顶部