64bit에서 malloc함수에 대한 질문입니다.
지금 구현하고 있는 프로그램에서 Alloc 함수가 제대로 동작을 안해서 분석을 해본 결과 malloc이 잘 안되는것을 깨달았습니다.
코드는 다음과 같습니다.
먼저 제가 구현한 struct 입니다.
typedef struct vertex_int_struct v_int_t; struct vertex_int_struct { int type; sol_t* s1; sol_t* s2; sol_t* s3; array_t* wire; int prim_edges; };
sol_t*와 array_t* 역시 별도로 지정되어 있는 구조체 입니다.
제가 만든 alloc 함수는 다음과 같습니다.
v_int_t* v_int_alloc() { v_int_t* v = ALLOC(v_int_t,1); v->type = -1; v->s1 = NIL(sol_t); v->s2 = NIL(sol_t); v->s3 = NIL(sol_t); v->wire = array_alloc(sol_t*,4); if(g_LEDI==2) printf("v_int_alloc return add = %x %x\n",v,*v); return v; } #define ALLOC(type, num) ((type *) malloc(sizeof(type) * (num)))
이제 이 코드를 사용을 해보았습니다.
v_int_t* this_v = v_int_alloc(); this_v -> type = 3;
이때 this_v -> type = 3; 이 부분이 평소에는 잘 돌아가다가 어느순간 프로그램이 seg fault를 뱉어냅니다.
서버에 ulimit으로 한 사람이 사용할수 있는 메모리는 3기가로 지정해 놓았으며 프로그램이 죽을 당시에도 1.6기가 정도만 사용을 한 상태였습니다.
제가 만든 v_int_alloc 내부에서 만들어진 주소값을 살펴보면 평소에는 0x7FFFF2A0 과 같이 0x7FFF~ 로 시작을 할때는 정상적으로 동작을 하나
어느순간 0x8000~로 시작을 하는 순간 v_int_alloc 함수로 부터 받아온 주소값이 0xFFFFFFFF8000~ 이런식으로 dummy 주소값으로 바뀌어 버립니다. (32bit에서 Sign Ext를 하는듯 합니다.)
서버는 x86_64, 64bit이며, 메모리는 8기가이며
/proc/cpuinfo는 다음과 같습니다.
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Xeon(R) CPU E5345 @ 2.33GHz stepping : 7 cpu MHz : 2327.505 cache size : 4096 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 4 fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall lm constant_tsc pn i monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm bogomips : 4658.30 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management:
이러한 processor가 0~7 까지 있네요.
뭐라고 검색을 해야 할지도 모르겠고
조언을 주시면 감사하겠습니다.
질문에 어떤 내용을 더 달아야 하는지도 잘 모르겠네요.
...
혹시 http://kldp.org/node/121116 여기 나온 것과 유사한 상황일지도...
malloc이 선언된 헤더 파일을 include했는지 일단 확인해 주세요.
댓글 달기