Gdb: Difference between revisions

From 탱이의 잡동사니
Jump to navigation Jump to search
No edit summary
 
Line 1: Line 1:
== Overview ==
== Overview ==
리눅스 gdb 사용법 내용 정리.
리눅스 gdb 사용법 내용 정리.
== Basic ==
gdb 이용시, 보통 다음의 순서로 진행된다.
* gdb 를 core 파일과 같이 실행
* where 명령어로 crash 가 발생했던 스택을 확인.
* frame 명령어로 의심스러운 frame 지정.
* list 명령어로 대략적인 코드 내용 확인
* print 명령어로 variable print.
위의 내용 반복..
<pre>
(gdb) where
#0  0x00007fe87fa6c0c2 in pj_strdup (pool=0x7fe7509ef1e0, dst=0x7fe76d5fca18, src=0x0) at ../include/pj/string_i.h:40
#1  0x00007fe87fa15e84 in pjmedia_sdp_neg_modify_local_offer2 (pool=0x7fe7509ef1e0, neg=0x7fe76da058c0, flags=1, local=0x7fe76dc558a8) at ../src/pjmedia/sdp_neg.c:336
#2  0x00007fe87f9928b0 in pjsip_inv_reinvite (inv=0x7fe76d9551e8, new_contact=0x0, new_offer=0x7fe76dc558a8, p_tdata=0x7fe7aff81ba0) at ../src/pjsip-ua/sip_inv.c:3004
#3  0x00007fe821af5c6c in ast_sip_session_refresh (session=0x7fe76dbbb290, on_request_creation=0x0, on_sdp_creation=0x0, on_response=0x7fe80a9028ae <on_topology_change_response>, method=AST_SIP_SESSION_REFRESH_METHOD_INVITE, generate_new_sdp=1, media_state=0x7fe834cfa590)
    at res_pjsip_session.c:1750
#4  0x00007fe821af443b in send_delayed_request (session=0x7fe76dbbb290, delay=0x7fe7ee8f97d0) at res_pjsip_session.c:1238
#5  0x00007fe821af479d in invite_terminated (vsession=0x7fe76dbbb290) at res_pjsip_session.c:1337
#6  0x00005582959ce79e in ast_taskprocessor_execute (tps=0x7fe76d9174c0) at taskprocessor.c:1185
#7  0x00005582959d808e in execute_tasks (data=0x7fe76d9174c0) at threadpool.c:1354
#8  0x00005582959ce79e in ast_taskprocessor_execute (tps=0x558298a5ad80) at taskprocessor.c:1185
#9  0x00005582959d5c41 in threadpool_execute (pool=0x558298a55c30) at threadpool.c:367
#10 0x00005582959d78c0 in worker_active (worker=0x7fe7db36acc0) at threadpool.c:1137
#11 0x00005582959d7630 in worker_start (arg=0x7fe7db36acc0) at threadpool.c:1056
#12 0x00005582959e0fd0 in dummy_start (data=0x7fe7db36ad80) at utils.c:1249
#13 0x00007fe87e0fe4a4 in start_thread (arg=0x7fe7aff82700) at pthread_create.c:456
#14 0x00007fe87c9bfd0f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:97
(gdb) frame 4
#4  0x00007fe821af443b in send_delayed_request (session=0x7fe76dbbb290, delay=0x7fe7ee8f97d0) at res_pjsip_session.c:1238
1238 ast_sip_session_refresh(session, delay->on_request_creation,
(gdb) list
1233 session->channel ? ast_channel_name(session->channel) : "",
1234 delayed_method2str(delay->method));
1235
1236 switch (delay->method) {
1237 case DELAYED_METHOD_INVITE:
1238 ast_sip_session_refresh(session, delay->on_request_creation,
1239 delay->on_sdp_creation, delay->on_response,
1240 AST_SIP_SESSION_REFRESH_METHOD_INVITE, delay->generate_new_sdp, delay->media_state);
1241 /* Ownership of media state transitions to ast_sip_session_refresh */
1242 delay->media_state = NULL;
(gdb) p delay->method
$4 = DELAYED_METHOD_INVITE
</pre>


== ETC ==
== ETC ==

Latest revision as of 10:07, 17 February 2020

Overview

리눅스 gdb 사용법 내용 정리.

Basic

gdb 이용시, 보통 다음의 순서로 진행된다.

  • gdb 를 core 파일과 같이 실행
  • where 명령어로 crash 가 발생했던 스택을 확인.
  • frame 명령어로 의심스러운 frame 지정.
  • list 명령어로 대략적인 코드 내용 확인
  • print 명령어로 variable print.

위의 내용 반복..

(gdb) where
#0  0x00007fe87fa6c0c2 in pj_strdup (pool=0x7fe7509ef1e0, dst=0x7fe76d5fca18, src=0x0) at ../include/pj/string_i.h:40
#1  0x00007fe87fa15e84 in pjmedia_sdp_neg_modify_local_offer2 (pool=0x7fe7509ef1e0, neg=0x7fe76da058c0, flags=1, local=0x7fe76dc558a8) at ../src/pjmedia/sdp_neg.c:336
#2  0x00007fe87f9928b0 in pjsip_inv_reinvite (inv=0x7fe76d9551e8, new_contact=0x0, new_offer=0x7fe76dc558a8, p_tdata=0x7fe7aff81ba0) at ../src/pjsip-ua/sip_inv.c:3004
#3  0x00007fe821af5c6c in ast_sip_session_refresh (session=0x7fe76dbbb290, on_request_creation=0x0, on_sdp_creation=0x0, on_response=0x7fe80a9028ae <on_topology_change_response>, method=AST_SIP_SESSION_REFRESH_METHOD_INVITE, generate_new_sdp=1, media_state=0x7fe834cfa590)
    at res_pjsip_session.c:1750
#4  0x00007fe821af443b in send_delayed_request (session=0x7fe76dbbb290, delay=0x7fe7ee8f97d0) at res_pjsip_session.c:1238
#5  0x00007fe821af479d in invite_terminated (vsession=0x7fe76dbbb290) at res_pjsip_session.c:1337
#6  0x00005582959ce79e in ast_taskprocessor_execute (tps=0x7fe76d9174c0) at taskprocessor.c:1185
#7  0x00005582959d808e in execute_tasks (data=0x7fe76d9174c0) at threadpool.c:1354
#8  0x00005582959ce79e in ast_taskprocessor_execute (tps=0x558298a5ad80) at taskprocessor.c:1185
#9  0x00005582959d5c41 in threadpool_execute (pool=0x558298a55c30) at threadpool.c:367
#10 0x00005582959d78c0 in worker_active (worker=0x7fe7db36acc0) at threadpool.c:1137
#11 0x00005582959d7630 in worker_start (arg=0x7fe7db36acc0) at threadpool.c:1056
#12 0x00005582959e0fd0 in dummy_start (data=0x7fe7db36ad80) at utils.c:1249
#13 0x00007fe87e0fe4a4 in start_thread (arg=0x7fe7aff82700) at pthread_create.c:456
#14 0x00007fe87c9bfd0f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:97

(gdb) frame 4
#4  0x00007fe821af443b in send_delayed_request (session=0x7fe76dbbb290, delay=0x7fe7ee8f97d0) at res_pjsip_session.c:1238
1238			ast_sip_session_refresh(session, delay->on_request_creation,

(gdb) list
1233			session->channel ? ast_channel_name(session->channel) : "",
1234			delayed_method2str(delay->method));
1235
1236		switch (delay->method) {
1237		case DELAYED_METHOD_INVITE:
1238			ast_sip_session_refresh(session, delay->on_request_creation,
1239				delay->on_sdp_creation, delay->on_response,
1240				AST_SIP_SESSION_REFRESH_METHOD_INVITE, delay->generate_new_sdp, delay->media_state);
1241			/* Ownership of media state transitions to ast_sip_session_refresh */
1242			delay->media_state = NULL;

(gdb) p delay->method
$4 = DELAYED_METHOD_INVITE

ETC

Print pretty

strucuture 프린트시, 읽기 쉽게 프린팅이 된다.

(gdb) set print pretty on
(gdb) print *dst
$2 = {
  ptr = 0x7fe76d5fcf58 "-\377<l\347\177",
  slen = 1
}

(gdb) set print pretty off
(gdb) print *dst
$3 = {ptr = 0x7fe76d5fcf58 "-\377<l\347\177", slen = 1}