Chinaunix

标题: 这两天很郁闷,程序测试的时候出现“段错误-核心陷阱” [打印本页]

作者: arenxl    时间: 2007-02-01 16:24
标题: 这两天很郁闷,程序测试的时候出现“段错误-核心陷阱”
我也知道可能是非法内存访问或者越界,但就是找不出来是哪里出现了问题。达人们给点建议吧。3x
作者: kf701    时间: 2007-02-01 16:30
哈哈,没办法啦
作者: mq110    时间: 2007-02-01 16:31
gdb...
作者: lishengxu    时间: 2007-02-01 16:47
我给楼主的建议就是一点点调试
我认为这样找错误效率能高一点
别的好的办法我也不知道
作者: arenxl    时间: 2007-02-01 16:52
单个执行没有问题,是不是我写的压力测试程序有问题?
作者: arenxl    时间: 2007-02-01 16:53
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <strings.h>
#define MAXTHREAD 50
void *GetHlrThr1()
{
                char log[10];
                char num[3];
                memset(num,0,3);
                memset(log,0,10);
                sprintf(num,"%d",1);
                strcpy(log,"log");
                strcat(log,num);
                char cmd[100];
                memset(cmd,0,100);
                strcpy(cmd,"./test -222685306 \"HGSDP:MSISDN=8613508247798,ALL;\" ");
                strcat(cmd,log);
                printf("cmd(%s)\r\n",cmd);
                system(cmd);
}
void *GetHlrThr2()
{
                char log[10];
                char num[3];
                memset(num,0,3);
                memset(log,0,10);
                sprintf(num,"%d",2);
                strcpy(log,"log");
                strcat(log,num);
                char cmd[100];
                memset(cmd,0,100);
                strcpy(cmd,"./test 642805463 \"DISPMSUB:SN=80649621,DATAKD=DIAGDATA,NDC=138;\" ");
                strcat(cmd,log);
                printf("cmd(%s)\r\n",cmd);
                system(cmd);
}

void *GetHlrThr3()
{
                char log[10];
                char num[3];
                memset(num,0,3);
                memset(log,0,10);
                sprintf(num,"%d",3);
                strcpy(log,"log");
                strcat(log,num);
                char cmd[100];
                memset(cmd,0,100);
                strcpy(cmd,"./test -160506378 \"LST SUB:ISDN=\\\"8613508299174\\\";\" ");
                strcat(cmd,log);
                printf("cmd(%s)\r\n",cmd);
                system(cmd);
}
void *GetHlrThr4()
{
                char log[10];
                char num[3];
                memset(num,0,3);
                memset(log,0,10);
                sprintf(num,"%d",4);
                strcpy(log,"log");
                strcat(log,num);
                char cmd[100];
                memset(cmd,0,100);
                strcpy(cmd,"./test 642805463 \"DISPMSUB:SN=80765903,DATAKD=DIAGDATA,NDC=138;\" ");
                strcat(cmd,log);
                printf("cmd(%s)\r\n",cmd);
                system(cmd);
}

void *GetHlrThr5()
{
                char log[10];
                char num[3];
                memset(num,0,3);
                memset(log,0,10);
                sprintf(num,"%d",5);
                strcpy(log,"log");
                strcat(log,num);
                char cmd[100];
                memset(cmd,0,100);
                strcpy(cmd,"./test 642805463 \"DISPMSUB:SN=47836448,DATAKD=DIAGDATA,NDC=135;\" ");
                strcat(cmd,log);
                printf("cmd(%s)\r\n",cmd);
                system(cmd);
}

void *GetHlrThr6()
{
                char log[10];
                char num[3];
                memset(num,0,3);
                memset(log,0,10);
                sprintf(num,"%d",6);
                strcpy(log,"log");
                strcat(log,num);
                char cmd[100];
                memset(cmd,0,100);
                strcpy(cmd,"./test 642805463 \"HGSDP:MSISDN=8613698106994,ALL;\" ");
                strcat(cmd,log);
                printf("cmd(%s)\r\n",cmd);
                system(cmd);
}


int main()
{
        /*int i = 0;
        for(;i<10;i++)
        {
                char log[10];
                char num[3];
                memset(num,0,3);
                memset(log,0,10);
                sprintf(num,"%d",i);
                strcpy(log,"log");
                strcat(log,num);
                char cmd[100];
                memset(cmd,0,100);
                strcpy(cmd,"./test -222685306 \"HGSDP:MSISDN=8613508247798,ALL;\" ");
                strcat(cmd,log);
                printf("cmd(%s)\r\n",cmd);
                system(cmd);
        }
        pthread_t thrs[MAXTHREAD];
        int ithrs[MAXTHREAD];
        int i = 0;
        for(;i<MAXTHREAD;i++)
        {
                ithrs[i]= 1;
        }
        i = 0;
        for(;i<MAXTHREAD;i++)
        {
                //int iThread = pthread_create(&thrGetData,NULL,GetData,NULL);
                ithrs[i] = pthread_create(&(thrs[i]),NULL,GetHlrThr,NULL);
                printf("thr%d\r\n",i);
        }
        int k=0;
        while(k>MAXTHREAD)
        {
                i=0;
                for(;i<MAXTHREAD;i++)
                {
                        if(ithrs[i] == 0)
                        {
                                pthread_join(ithrs[i],NULL);
                                k++;
                        }
                }
        }
        return 0;

        */

        pthread_t thr1,thr2,thr3,thr4,thr5,thr6,thr7,thr8,thr9,thr10;
        int i1,i2,i3,i4,i5,i6,i7,i8,i9,i10;
        i1=pthread_create(&thr1,NULL,GetHlrThr1,NULL);
        i2=pthread_create(&thr2,NULL,GetHlrThr2,NULL);
        i3=pthread_create(&thr3,NULL,GetHlrThr3,NULL);
        i4=pthread_create(&thr4,NULL,GetHlrThr4,NULL);
        i5=pthread_create(&thr5,NULL,GetHlrThr5,NULL);
        i6=pthread_create(&thr6,NULL,GetHlrThr6,NULL);
        /*i7=pthread_create(&thr7,NULL,GetHlrThr,NULL);
        i8=pthread_create(&thr8,NULL,GetHlrThr,NULL);
        i9=pthread_create(&thr9,NULL,GetHlrThr,NULL);
        i10=pthread_create(&thr10,NULL,GetHlrThr,NULL);*/
       
        pthread_join(thr1,NULL);
        pthread_join(thr2,NULL);
        pthread_join(thr3,NULL);
        pthread_join(thr4,NULL);
        pthread_join(thr5,NULL);
        pthread_join(thr6,NULL);
        /*pthread_join(thr7,NULL);
        pthread_join(thr8,NULL);
        pthread_join(thr9,NULL);
        pthread_join(thr10,NULL);*/
        printf("成功执行!\r\n");
}

以上是一个简单的多线程调用程序
作者: 醉卧水云间    时间: 2007-02-01 20:34
打开编译参数-v -da -Q -g -O0
编译代码,如果代码超过2万行,建议睡觉前开始编译早上起来可以收获了。
作者: xlzhang81    时间: 2007-02-01 23:31
why not use gdb debug you program??
作者: wuqing    时间: 2007-02-02 10:37
原帖由 arenxl 于 2007-2-1 16:53 发表
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <strings.h>
#define MAXTHREAD 50
void *GetHlrThr1()
{
                char log[10];
...


这个程序可以运行,没有什么问题
作者: wuqing    时间: 2007-02-02 10:41
原帖由 arenxl 于 2007-2-1 16:53 发表
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <strings.h>
#define MAXTHREAD 50
void *GetHlrThr1()
{
                char log[10];
...



提醒一下,编译以后的程序名不要用test,否则递归调用,很快就会把资源耗尽
作者: arenxl    时间: 2007-02-02 22:48
提醒一下,编译以后的程序名不要用test,否则递归调用,很快就会把资源耗尽


不是很明白,望指点一下。
作者: techero    时间: 2007-02-03 09:40
pstack 看下core
作者: arenxl    时间: 2007-02-05 11:16
如何察看呢?程序运行很快,来不及查询pid就完了。
另外,多线程调用同一个后台程序来获取信息是不是有原理问题?
作者: arenxl    时间: 2007-02-07 09:13
找到问题了,原来是传给HLR交换机命令的参数有问题,晕菜了,害我白找了很长时间。
作者: wuqing    时间: 2007-02-07 15:18
原帖由 arenxl 于 2007-2-2 22:48 发表
提醒一下,编译以后的程序名不要用test,否则递归调用,很快就会把资源耗尽


不是很明白,望指点一下。

你 gcc -o test yoursource.c
然后运行 ./test

我在一台 3G RAM, 2 X 3GHz的X346,(OS是Linux)上运行
1分钟不到机器就没有任何响应,连键盘和鼠标都没有反应。
作者: 飞灰橙    时间: 2007-02-07 17:08
原帖由 arenxl 于 2007-2-1 16:53 发表
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <strings.h>
#define MAXTHREAD 50
void *GetHlrThr1()
{
                char log[10];
...


Ctrl-C / Ctrl-V
作者: arenxl    时间: 2007-02-08 00:44
原帖由 wuqing 于 2007-2-7 15:18 发表

你 gcc -o test yoursource.c
然后运行 ./test

我在一台 3G RAM, 2 X 3GHz的X346,(OS是Linux)上运行
1分钟不到机器就没有任何响应,连键盘和鼠标都没有反应。

兄弟,这个有没有科学依据呢?难道就因为程序命名为test就导致你了说的恶劣后果。 不过我还是以后避免这种命名,宁可信其有。不过,我还是希望兄弟能够深入找一下原因,是不是有其它原因导致了你说的结果?
作者: wuqing    时间: 2007-02-08 12:56
原帖由 arenxl 于 2007-2-8 00:44 发表

兄弟,这个有没有科学依据呢?难道就因为程序命名为test就导致你了说的恶劣后果。 不过我还是以后避免这种命名,宁可信其有。不过,我还是希望兄弟能够深入找一下原因,是不是有其它原因导致了你说的结果?

strcpy(cmd,"./test -222685306 \"HGSDP:MSISDN=8613508247798,ALL;\" ");
strcat(cmd,log);
printf("cmd(%s)\r\n",cmd);
system(cmd);

你的每一个线程里都有system(cmd), 而 cmd中包含 ./test,你说这个程序该如何运行呢?
你可以测试测试啊。
1. 你的程序,至少是你给的那段代码是可以完整地运行的
2. 肯定会导致进程和线程资源用完
作者: wuqing    时间: 2007-02-08 12:59
补充一下,在Unix环境下最好不要用test作为程序名,因为有一个 /usr/bin/test 程序,shell编程中用的那个
test -Z ...
作者: arenxl    时间: 2007-02-08 14:52
你的每一个线程里都有system(cmd), 而 cmd中包含 ./test,你说这个程序该如何运行呢?
你可以测试测试啊。
1. 你的程序,至少是你给的那段代码是可以完整地运行的
2. 肯定会导致进程和线程资源用完  


不是,执行的程序为test,测试压力的程序为teststress。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2