Solaris pstack이 출력/출력 형식을 읽는 방법

Solaris pstack이 출력/출력 형식을 읽는 방법

pstack코어 파일에 Solaris 출력이 있습니다. 세그폴트가 발생할 때 문제의 함수에서 사용되는 매개변수에 로그의 숫자를 매핑하는 방법을 이해할 수 없습니다.

함수 호출에 대한 인수 수보다 출력에 더 많은 숫자가 있는 것으로 보입니다. 매개변수 값/주소는 어떤 숫자입니까?

이것수동전혀 도움이 되지 않습니다.

 ...
 fffffffec993a8a8 sigacthandler (b, ffffffff7fffd5e0, ffffffff7fffd300, 14b7b0, fffffffec9a86000, b) + 5c
 --- called from signal handler with signal 11 (SIGSEGV) ---
 fffffffeba4422b0 XmMessageBoxGetChild (100400, 5, 5, 0, 118, fffffffeba62e000) + e4
 000000010026a83c GetMessageDialog (101317440, 0, ffffffff7fffe130, 100420, 100400, 127a94) + 214
 000000010026ab0c _XmtDisplayMessage (101317440, 0, 1000c9510, 1011927e5, ffffffff7fffe240, 101192780) + 278
 000000010026b048 XmtDisplayInformationMsg (1000c9000, 1000c9, 100000, 2, 0, ffffffff7fffe2f8) + 44
 00000001001573ec _smog_w_alarm_post_ack_actions (101314990, 101192760, 1003a0, 1009f4970, 101317440, 100000) + 100
 000000010015819c __select_cb (101314990, ffffffff7fffe560, 101317440, 10113bfc0, 1000916d0, 10120c9d0) + 1b4
 0000000100257a04 XmtCallCallback (101314990, 100257, ffffffff7fffe560, 101183530, 0, 0) + 3c4
 ...

우리가 다룬 유일한 두 가지 응용 프로그램 기능은 __select_cb()및 이고 _smog_w_alarm_post_ack_actions()나머지는 Motif GUI/위젯 라이브러리 호출이었습니다. 하지만 함수 정의를 살펴보세요.

static void __select_cb( Widget w, XtPointer call_data );
void _smog_w_alarm_post_ack_actions( Widget w, Alarm_Public_Data *alarm );

각 함수에는 두 개의 매개변수만 있습니다. Widget포인터 중 하나가 잘못되었을 것으로 예상했습니다 (아마도닫힌 창을 가리킵니다.) 문제를 디버깅하는 데 도움이 되도록 이러한 숫자 중 어느 것이 실제 매개변수 값/주소에 매핑되는지 알고 싶습니다.

답변1

인쇄된 함수 인수는 전체 디버거가 아니기 pstack때문에 "최선의 추측" 작업 pstack()이며 어떤 경우에는 전체 디버거라도 전체 디버그 데이터 없이는 함수 인수의 정확한 재현을 보장할 수 없습니다.

Solaris pstack명령은 다음을 기반으로 합니다.libproc.so도서관, 공정 제어 및 정보 기능을 제공합니다. 바라보다일루모스 pstack소스코드유틸리티가 다음을 pstack사용하여 프로세스 호출 스택을 검색하는 방법을 알아보세요.Pstack_iter()기능.

~에 따르면노트부분:

노트

각 프레임에 대한 매개변수의 수와 값, 그리고 모든 레지스터의 값을 결정하는 것은 다소 경험적입니다. 따라서 , 및 함수에 전달된 매개변수 regs의 값이 argc정확하다는 보장은 없습니다.argvcall-back()

일반적으로 매개변수가 무엇인지 추론하는 것이 가능합니다. sigacthandler (b, ...위에서 볼 수 있습니다 --- called from signal handler with signal 11 (SIGSEGV) ---. 이 경우 16진수 b는 10진수 11- 입니다 SIGSEGV.

와 같은 값은 101314990힙 주소일 수 있고, 와 유사한 값은 ffffffff7fffe560스택 주소일 수 있습니다. 이 유틸리티를 사용하면 pmap프로세스의 주소 공간을 검사하여 이러한 값을 확인할 수 있습니다.

더 확실성이 필요한 경우 전체 디버거를 사용하고 디버그 기호를 사용하여 컴파일하세요.

관련 정보