리눅스에서는 실행이 되고 맥에서는 실행이 안되서 물어봅니다.

thinga3의 이미지

리눅스에서 make를 하고 실행을 하면 정상적으로 되는데
맥(Lion)에서는 make를 해서 정상적으로 만들어지는데 실행을 하면 segmentation fault: 11이 뜹니다.
왜 그런지 알고 싶습니다.

실행방법은 첨부된 파일을 압축을 풀고
그 폴더안의 dspect -- limseed를 컴파일을 하고
다시 dspect 폴더에서 컴파일을 한 후
2012.08.16폴더에서 readme에 쓰인대로 하시면 됩니다.

File attachments: 
첨부파일 크기
파일 Field.tar3.42 MB
shint의 이미지

//------------------------------------------------------
//윈도우에서 컴파일 해봤습니다.
//나름 노력한거지만. 이보다 더 많은 노력이 필요할겁니다.
//------------------------------------------------------
 
 
//------------------------------------
//라이브러리 빌드 : libmseed.lib
//------------------------------------
 
1.소스를 다운 받아 c:\에 압축을 해제합니다. (한글이나 띄워써지는 폴더는 컴파일시 문제가 될 수있습니다.)
2. Field\dspect\libmseed 이 폴더로 가서 nmake -f Makefile.win을 입력합니다.
 
그러면 아래와 같은 에러가 마구 쏟아 집니다.
fileutils.c
fileutils.c(463) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(485) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(486) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(500) : error C2059: syntax error : 'bad suffix on number'
fileutils.c(500) : error C2146: syntax error : missing ')' before identifier 'L'
fileutils.c(500) : error C2198: 'ms_matchselect' : too few actual parameters
fileutils.c(500) : error C2059: syntax error : 'bad suffix on number'
fileutils.c(508) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(517) : error C2181: illegal else without matching if
fileutils.c(522) : error C2065: 'srcname' : undeclared identifier
fileutils.c(522) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(530) : error C2043: illegal break
fileutils.c(540) : error C2044: illegal continue
fileutils.c(542) : error C2059: syntax error : '}'
fileutils.c(688) : error C2059: syntax error : 'if'
fileutils.c(703) : error C2059: syntax error : '}'
fileutils.c(711) : error C2059: syntax error : 'return'
fileutils.c(712) : error C2059: syntax error : '}'
NMAKE : fatal error U1077: 'cl' : return code '0x2'
Stop.
 
//
long 이 틀리답니다.
저는 이것에 대해 대충 임시로 해결 했습니다. 제대로 된 해결 방식은 이것저것 해보셔야 할거 같습니다.
저는 일단 컴파일만 성공 시키는게 목적입니다. ㅡ_ㅡ;;;
 
//검색 내용
MATLAB_R2009a lion segmentation fault: 11
 
//segmentation violation
http://www.javaservice.com/~java/bbs/read.cgi?b=QandA&c=r_p&n=978683094
 
http://iich.tistory.com/104
http://kldp.org/node/48719
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=116193721&qb=ZXJyb3IgQzI2MzI6ICdsb25nJyBmb2xsb3dlZCBieSAnbG9uZycgaXMgaWxsZWdhbA==&enc=utf8&section=kin&rank=1&search_sort=0&spq=0
 
//처리 방식
//long double 로 임시 처리.
 
fileutils.c(463) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(485) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(486) : error C2632: 'long' followed by 'long' is illegal
 
//http://blog.naver.com/lolabunny99?Redirect=Log&logNo=10024471992
//#define HPTERROR -2145916800000000LL
//#define HPTERROR -2145916800000000L 로 임시 변경.
fileutils.c(500) : error C2059: syntax error : 'bad suffix on number'
fileutils.c(500) : error C2146: syntax error : missing ')' before identifier 'L'
fileutils.c(500) : error C2198: 'ms_matchselect' : too few actual parameters
fileutils.c(500) : error C2059: syntax error : 'bad suffix on number'
 
//long int 를 double로 변경 - 찾아보니 이런게 있슴. uint64_t
fileutils.c(508) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(517) : error C2181: illegal else without matching if
fileutils.c(522) : error C2065: 'srcname' : undeclared identifier
fileutils.c(522) : error C2632: 'long' followed by 'long' is illegal
fileutils.c(530) : error C2043: illegal break
fileutils.c(540) : error C2044: illegal continue
fileutils.c(542) : error C2059: syntax error : '}'
fileutils.c(688) : error C2059: syntax error : 'if'
fileutils.c(703) : error C2059: syntax error : '}'
fileutils.c(711) : error C2059: syntax error : 'return'
fileutils.c(712) : error C2059: syntax error : '}'
NMAKE : fatal error U1077: 'cl' : return code '0x2'
Stop.
 
//
일단. 이런 처리들을 다하면. 에러가 안나고. 
libmseed.lib 파일이 생성 됩니다. 성공입니다.
 
 
//------------------------------------
//윈도우에서 Qt로 dspect빌드하기
//------------------------------------
 
저는 윈도우에서 Qt로 빌드를 해보려고 했는데요. 안되네요. mex.h 파일이 없습니다.
matlab관련 함수가 필요한데. matlab에 접속해 보니. 3일 후에 샘플을 주겠다고 합니다. 된장. 안합니다.
 
하튼.
C:\Qt\Field\dspect 요기로 가서
qmake -project 라고 입력하면. dspect.pro 파일이 생성됩니다.
 
Qt는 <a href="http://qt.digia.com/" rel="nofollow">http://qt.digia.com/</a> 요기서 다운 받을 수 있습니다.
현재. 그와 관련된 링크가 많은데요.... 아래 모두 첨부하면 안될거 같아 내버려 둡니다. ㅡ_ㅡ;;;
 
이제 컴파일만 해보면 됩니다.
이것저것 에러가 나는데. 수정하다보니 잘 됩니다.
 
mex.h 만 빼고요.
진짜 문제에 대한 확인은 하기 힘들어서.
VC 6.0으로 resp.c 파일에 함수만 내용을 복사해서. 테스트 샘플을 만들어 봤습니다.
 
결국엔...
VC 6.0에서 문제에 대한 답을 여러가지 얻었는데요.
 
가장 눈에 띄는것은. 할당된 배열의 크기와 같은 변수의 배열 번호 였습니다. malloc에서 배열 공간을 하나 더 추가 해줘야 합니다.
	    nz = 3;
	    np = 4;
 
	    zeros = (dcomplex *)malloc(np*sizeof(dcomplex));
	    poles = (dcomplex *)malloc(np*sizeof(dcomplex));
 
            zeros[0].real = 0.;  zeros[0].imag = 0.;
            zeros[1].real = 0.;  zeros[1].imag = 0.;
            zeros[2].real = 146.5;  zeros[2].imag = 0.;
 
            poles[0].real = -5.89e-3;  poles[0].imag = +5.89e-3;
            poles[1].real = -5.89e-3;  poles[1].imag = -5.89e-3;
            poles[2].real = -7.32e+1;  poles[2].imag = +3.76e+1;
            poles[3].real = -7.32e+1;  poles[3].imag = -3.76e+1;
 
 
나머지 문제는 하나씩 확인해보는 수밖에 없을거 같습니다.
gdb로 core dump로 내서 찾는 방법도 있고.
저 처럼 VC로 포팅해서 하나씩 찾아보는 방법도 있고.
Qt로 이것저것 보면서 찾아 보는 방법 등등... 이것저것 해보셔야 할거 같습니다.
 
 
	//Unhandled exception in test.exe 0xC0000005: Access Violation
	//char buf[3];
	//char*p = buf;
	//strcpy(buf, "shint");
 
	//Unhandled exception in test.exe 0xC0000005: Access Violation
//	char* p = "test";
//	p[0] = 'a';
 
 
	//??
//	char buf[6] = "shint";
//	char*p = NULL;	//buf;
//	for(int i=0; i<100; i++)
//	{
//		char n = *(p+i);
//		printf("%c", n);
//	}
//	printf("\n");
 
	//Unhandled exception in test.exe 0xC0000005: Integer Divide Zero
//	int n = 0;
//	double d = 10.0;
//	d = d/n;
//	d = n/0;
 
	//http://cboard.cprogramming.com/cplusplus-programming/149478-segmentation-fault-11-a.html
	//error C2117: 'ab' : array bounds overflow
//	int* n = (int*) malloc (2*sizeof(int));
//	n[0] = 10;
//	n[1] = 11;
 
	//error C2117: 'ab' : array bounds overflow
//	char buf[2] = "ab";
//	buf[0];
//	buf[1];
 
 
//	중괄호 (*+-/) 확인
//	* & 참조값 확인
//	[] 배열과 *의 주소위치 + 확인.
//	double float __int64 uint64_t 형변환 데이터 확인
//	0으로 나누는지 확인.
//	배열을 넘는 값과 연산. 문자에 대해서 확인
 
//	함수를 확인할 수 있는 테스트 코드 만들어서 확인
//	for문'등에서 double등의 변수가 어떻게 증가되는지. 값이 일치하는지 확인
//	0. 등은. 0.0등으로 알아보기 쉽게 표기
 
//	32bit 64bit에서의 변수값 확인
//	gdb를 이용한 segment fault 확인
//	컴파일 레벨을 높여서. warring을 error로 표시
//	변수값 초기화 해주기
//	복잡한 구문 문법. 최소화해서 알아보기 쉽게 만들기.
//	자바 VM 버전의 문제도 있다고 합니다.
 
//	이와 같은 문제를 비교해보면. 대부분은 변수의 범위를 넘는 경우로 보여집니다.
//	소스 샘플 참고해보세요.
댓글 첨부 파일: 
첨부파일 크기
Package icon test segmentation fault 11 예제.zip5.87 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

philnet의 이미지

마침 제 맥이 라이언이어서 해 봤습니다.
말씀대로 seg. fault가 발생하더군요.
디버그용으로 빌드해서 gdb로 돌려 보았더니, 다음의 메시지가 나오네요.

"Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000001000ec000
0x0000000100000f45 in spgram (mst=0x100100c20) at spgram.c:104"

아마도 shint 님 말쓰대로 spect 배열의 영역을 넘어가는 게 이유 같은데요,
소스가 다 있으니, gdb로 쫓아 가면서 왜 그렇게 되었는 지를 확인해 보시면 시간이 좀 걸리더라도 원인은 찾으실 수 있을 겁니다.

자세한 gdb 실행 결과 첨부합니다.

Current directory is ~/Downloads/Field/dspect/
GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Thu Nov 3 21:59:02 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .. done

(gdb) set args ../2012.12.21/mseed/JNUA1.00.2012.356.ELE 30 15 0.01 10 50 8 ../pz/les.pz > JNUA1.00.ELE.dat
(gdb) r
Starting program: /Users/philnet/Downloads/Field/dspect/dspectro ../2012.12.21/mseed/JNUA1.00.2012.356.ELE 30 15 0.01 10 50 8 ../pz\
/les.pz > JNUA1.00.ELE.dat
Reading symbols for shared libraries +........................ done
dt: 0.005000, npts: 1487447, lf: 0.010000, hf: 10.000000
dt: 0.005000, N: 262144, df: 0.000763

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000001000ec000
0x0000000100000f45 in spgram (mst=0x100100c20) at spgram.c:104
(gdb)

-uuu:**-F1 *gud-dspectro* All L20 (Debugger:run [signal])---------------------------------------------------------------------
if( i == 0 )
{
df = 1./(dt*N);
resp = get_inst_resp(stype,rtype,1./(dt*N),gain,cnst,N/2+1,pzfile);
for(j=1;j<=N/2;j++) resp[j-1] *= resp[j-1];
fprintf(stderr,"dt: %lf, N: %d, df: %lf\n",dt,N,df);
}

for(j=1,freq=df;j<=N/2;j++,freq+=df)
{
=> spect[j] /= resp[j-1]/freq/freq/4/M_PI/M_PI; // differentiation
// spect[j] *= pow(2.*M_PI*freq,2.);
}

smooth(spect+1,N/2,5);

// if( debug ) fprintf(stderr,"%10d, N:%d\n",i/20,N);
outfreq = lf;
logfreq = log10(lf);
outlogdf = log10(hf/lf)/outdf;
sum = 0.;
-uu-:---F1 spgram.c 61% L104 (C/l Abbrev)----------------------------------------------------------------------------------

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.