![]() |
|
|
|
|
|||||||
| Forums | Portal | Register | Forum Rules | FAQ | Contribute | Members List | Arcade | Search | Today's Posts | Mark Forums Read |
| High Level Programming Post questions about C, C++, Java, SQL, and other programming languages here. |
|
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Segmentation fault | big123456 | Linux | 0 | 07-20-2007 02:01 AM |
| Segmentation fault | rshaikh | AIX | 2 | 04-16-2007 05:12 AM |
| SIGSEGV, Segmentation fault | micmac700 | High Level Programming | 2 | 12-13-2006 12:40 PM |
| segmentation fault | rockgal | High Level Programming | 8 | 12-05-2006 08:16 AM |
| Program received signal SIGABRT, Aborted. | napapanbkk | High Level Programming | 1 | 06-06-2006 07:20 AM |
|
|
Submit Tools | LinkBack | Thread Tools | Display Modes |
|
|||
|
Program received signal SIGSEGV, Segmentation fault.
Dear all,
I used debugger from C++ and these are the message I got: Program received signal SIGSEGV, Segmentation fault. 0x00323fc0 in free () from /lib/tls/libc.so.6 (gdb) info s #0 0x00323fc0 in free () from /lib/tls/libc.so.6 #1 0x00794fa1 in operator delete () from /usr/lib/libstdc++.so.6 #2 0x080d3934 in matvec::MIM::release (this=0xbfe8e710) at mim.cpp:49 #3 0x0805f57c in ~MIM (this=0xbfe8e710) at mim.h:120 #4 0x0805eedc in main () at analysis.cpp:199 I think the problem comes from "free () from /lib/tls/libc.so.6" but I don't know what it means and how to fix it. Could somebody educate me what the error mean and how to fix it? I know very little about Linux but I am willing to learn. Thank you for your help. |
| Forum Sponsor | ||
|
|
|
|||
|
The problem in not in free. You get this error when your code has altered (overwritten) an object pointer. This usually happens when you overflow an array.
libstd++ uses libc calls because C++ is compiled to use a lot of C primitives. I think your problem manifests itself at mim.cpp line 49. (In other words, you overwrote memory prior to that line and when free was executed it the pointer it was trying to free actually referenced invalid memory ) Try using either valgrind or electric fence to isolate your problem. |
|
|||
|
I search from the Internet to see how I can use 'valgrind'.
I tried this: valgrind --memcheck analysis.exe but I got a complaint: valgrind: Missing --tool option Available tools: addrcheck none callgrind corecheck helgrind memcheck lackey cachegrind massif Please advise. Thank you so much. |
|
|||
|
segmentation fault .. atoi[argv[2])
Hi ,
I have little bit of knowledge in C++.When I run the following program its gives me segmentation error. I tried to do all the possible things by reading online but not able to figure out the error. I ran it using gdb debugger but still it stays error is somewhere near n=atoi(argv[2]); I tried to use valgrind but still no use.. but i am not sure. Can somebody please help me in finding the error. I am using ubuntu. g++ compiler. my command line arguments are ./output 2 3 abc.pbm 1.2 abc2.pbm 1.3 Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <time.h>
using namespace std;
#define MAX 90
#define Lwire 2 // length of the wire 2mm -- all values are for 130nm technology
#define Nwire 128 // Number of wires 128
#define Llink 0.5 // average link load .5
#define powerleakage 2032.8 // leakage power 2032.8nw
#define V 1 BIG_DYN[y] // voltage= 1V
#define Ibias 1 // Ibias=1nA
#define K1 0.39
#define K2 .12
#define POP_SIZE 50
#define R_CO .33
#define R_MUT .1
int pbm[MAX][MAX][MAX],pgm[MAX][MAX],dist[MAX][MAX]={0};
int a=0,b=0,nodes,arg;
//int m,n;
double TotalDynEnergy=0,minTotalDynEnergy=0;
char head[4],head1[4];
int maxd;
// int layoutnumber=0;
// int layoutminTotalDynEnergy;
/**** Dynamic Energy for each communication pattern ****/
double energy( void)
{ int i,j,d;
double powerdyn,powershtckt,powertotal,energy=0;
maxd=0;
powerdyn= ( K1 +( K2 * Lwire))* Nwire * Llink;// Dynamic power equation
// printf("\n power dyn %f \t",powerdyn);
//powershtckt=V*Ibias;
// powertotal=sumlinks*(powerdyn+powerleakage+powershtckt);
// printf("\n %f\n ",powertotal);
for(j=0;j<b;j++)
{ for (i=0;i<a;i++)
{
d=dist[j][i]; // printf("\n value of d %d\t",d);
if(d > maxd)
maxd=d; // max distance in the layout
if (d!=0)
{// Dynamic Energy for each entry in comm pattern
energy= energy+(0.37*d)+(powerdyn*(d-1)); // printf("\n energy %f",energy);
}
}
}
// printf("\n Dynamic energy for this pattern is %f \n",energy);
// printf("pattmaxd %d ",maxd);
return(energy);
}
/**** Load Communication paterns ****/
void loadpatterns(int argc,char **argv,int index)
{ FILE *pbmread;
int i,j;
pbmread = fopen (argv[arg],"r"); // open communication pattern file
/* if (!pbmread)
printf("\n Cannot open the Communication Pattern file ");
else
printf("\nCommunication Pattern with weight %s",argv[arg+1]);*/
fscanf(pbmread,"%s\n%d %d\n",head,&a,&b); //printf("\n%s\n%d %d\n",head,a,b);
for (j=0;j<b;j++)
{ for(i=0;i< a;i++)
{ fscanf(pbmread,"%d",&pbm[index][j][i]); // printf("%d ",pbm[index][j][i]);
}
//printf("\n");
}
fclose(pbmread);
}
/**** Distance Matrix and Total Dynamic Energy ****/
void groute(int argc,char **argv)
{
int x1,y1,x2,y2,k,l;
int index;
double DynEnergy;
float weight;
int distance;
int i,j;
for (arg=3,index=0;arg<argc;arg+=2,index++)
{
weight=atof(argv[arg+1]);
loadpatterns(argc,argv,index); // FUNCTION Load Communication Pattern
for (j=0;j<b;j++)
for (i=0;i<a;i++)
{ if (pbm[index][j][i]!=0)
{for (l=0;l<m;l++)
for (k=0;k<n;k++)
{ if (pgm[l][k] == i)
{ x1=l;y1=k;}
if (pgm[l][k]==j)
{ x2=l;y2=k;}
}
distance=(abs(y2-y1)+abs(x2-x1));// 'x+y'or manhattan distance between nodes for pbm[i][j]!=0
dist[j][i]=distance; // Distance matrix
}
if (pbm[index][j][i]==0)
{dist[j][i]=0;}
}
/*printf("\nweight %f ",weight);
printf("\n\nDistance Matrix\n");
for ( j=0;j<b;j++)
{ for ( i=0;i<a;i++)
printf("%d ",dist[j][i]);
printf("\n");
}*/
DynEnergy= energy(); // FUNCTION Dynamic energy for the pattern
TotalDynEnergy=TotalDynEnergy+DynEnergy;//Total Dynamic Energy for all patterns
}
}
int main(int argc,char *argv[])
{
int N_CO,N_MUT;
int dim;
//m=2; n=3;
// int ext1,ext2;
//printf(" %d %s %s %s",argc,argv[1],argv[2],argv[3],argv[4]);
int q;
printf("break1\n");
m=atoi(argv[1]);
n=atoi(argv[2]); // mxn layout
printf("\n %d %d",m ,n );
dim=m*n;
int x[dim];
int POP[POP_SIZE][dim];
float POP_DYN[POP_SIZE];
int i,j,k,l;
int first,second;
// int* ptr_co;
int t1[i];
float t;
int gen;
int MAX_Gen=10;
int layoutnumber=0;
for ( i=0;i<dim;i++)
x[i]=i;
q=n;
printf(" q is %d",q);
/**** Initial pop ***/
do { printf("enter loop");
for(i=0;i<dim;i++)
POP[layoutnumber][i]=x[i];
printf("layout break1");
l=0;k=0;
for(i=0;i<dim;i++)
{if (l==q)
{k=k+1;l=0;}
pgm[k][l]=x[i]; // layout of the nodes
l++;
}
printf("node break/n");
// groute(argc,argv);
// Dynamic Energy array
POP_DYN[layoutnumber]=TotalDynEnergy;
layoutnumber++;
TotalDynEnergy=0;
pskreddy
}while((next_permutation(x,x+dim)) /*&& ( layoutnumber < POP_SIZE)*/);
}
when i run gdb it gives #0 0xb7d3ed6c in __strtouq_internal () from /lib/tls/i686/cmov/libc.so.6 #1 0xb7d3eaff in __strtol_internal () from /lib/tls/i686/cmov/libc.so.6 #2 0xb7d3c166 in atoi () from /lib/tls/i686/cmov/libc.so.6 #3 0x08048b26 in main (argc=2, argv=0xbfb64324) at groute.cpp:140 (gdb) up 3 #3 0x08048b26 in main (argc=2, argv=0xbfb64324) at groute.cpp:140 140 n=atoi(argv[2]); // mxn layout Its giving error for n but not m.. i dont know why I appreciate any help pskr Last edited by blowtorch; 07-01-2007 at 03:46 AM. Reason: code tags |
|
|||
|
Quote:
If you give atoi a rubbish pointer it will trap. Print out argc and argv before this traps. |
|||
| Google The UNIX and Linux Forums |