Ruby 및 C로 작성된 프로그램이 있습니다. C 부분은 공유 라이브러리이며 Ruby 프로그램의 확장입니다. gprof를 사용하여 작성한 C 공유 라이브러리를 프로파일 링하려고합니다. 나는이 같은 공유 라이브러리를 컴파일 :Ruby 프로그램에 의해 호출 된 C 공유 라이브러리 프로파일 링
이gcc -I. -I/usr/lib/ruby/1.8/i486-linux -I/usr/lib/ruby/1.8/i486-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -march=i686 -O2 -ggdb -pg -fPIC -c extension.c
gcc -shared -o extension.so extension.o -L. -L/usr/lib -L. -Wl,-Bsymbolic-functions -rdynamic -Wl,-export-dynamic -lruby1.8 -lpthread -lrt -ldl -lcrypt -lm -lc
가 그럼 난이 공유 라이브러리를로드 루비 프로그램을 실행하고 나는 현재 디렉토리에 gmon.out 파일을 기대하지만, 어떤 이유로 파일의 gmon.out에 대한 생성되지 않습니다. 어떻게해야합니까?
나는 이것을 봤지만 만족스러운 답변을 찾을 수 없었다.
P. - 해결 방법으로, 프로필에 사용할 수있는 순수 C 프로그램 (공유 라이브러리로 생성되는 대신) 인 수정 된 버전을 사용할 수 있지만 동일한 C 확장의 두 버전을 유지 관리하는 것은 지루합니다. 둘 사이의 많은 차이).
공유 라이브러리를 직접 사용하는 C 프로그램을 작성해 보았습니다. 나는 즉시 공유 라이브러리를 초기화하는 동안 호출되는 루비 라이브러리 함수 중 하나에서 페이지 폴트를 얻는다. 나는 내부적으로 마술을 할 수있는 루비 프로그램에서로드 될 것으로 기대하고 있다고 생각합니다.
(gdb) bt
#0 0x0091556e in st_lookup() from /usr/lib/libruby1.8.so.1.8
#1 0x008e87c2 in rb_intern() from /usr/lib/libruby1.8.so.1.8
#2 0x008984a5 in rb_define_module() from /usr/lib/libruby1.8.so.1.8
#3 0x08048dd0 in Init_SimilarStr() at extension.c:542
#4 0x0804933e in main (argc=2, argv=0xbffff454) at extension.c:564
업데이트 :는 신경 쓰지 마십시오. #ifdef를 사용하여 Extension의 Ruby 부분을 컴파일하고 프로파일을 얻었습니다. 폐쇄.
누군가가 답변을 찾고있는 경우; 나는 -pg가 링커 명령에도 전달되어야한다고 생각한다. 즉'gcc -shared -o extension.so extension.o -L. -L/usr/lib -L. -Wl, -Bsymbolic-functions -rdynamic -Wl, -export-dynamic -lruby1.8 -lpthread -lrt -ldl -lcrypt -lm -lc -pg' – dashesy
답을 찾았 기 때문에이 질문을 닫지 않았 으면합니다. 다른 사람들에게도 유용합니다. –