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
정확하다는 보장은 없습니다.argv
call-back()
일반적으로 매개변수가 무엇인지 추론하는 것이 가능합니다. sigacthandler (b, ...
위에서 볼 수 있습니다 --- called from signal handler with signal 11 (SIGSEGV) ---
. 이 경우 16진수 b
는 10진수 11
- 입니다 SIGSEGV
.
와 같은 값은 101314990
힙 주소일 수 있고, 와 유사한 값은 ffffffff7fffe560
스택 주소일 수 있습니다. 이 유틸리티를 사용하면 pmap
프로세스의 주소 공간을 검사하여 이러한 값을 확인할 수 있습니다.
더 확실성이 필요한 경우 전체 디버거를 사용하고 디버그 기호를 사용하여 컴파일하세요.