zoukankan      html  css  js  c++  java
  • gdb

    Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el6_6.9.x86_64 libgcc-4.4.7-11.el6.x86_64 libstdc++-4.4.7-11.el6.x86_64 zlib-1.2.3-29.el6.x86_64
    (gdb) bt
    #0  0x00007f5de36f6625 in raise () from /lib64/libc.so.6
    #1  0x00007f5de36f7e05 in abort () from /lib64/libc.so.6
    #2  0x00007f5de4834a7d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib64/libstdc++.so.6
    #3  0x00007f5de4832bd6 in ?? () from /usr/lib64/libstdc++.so.6
    #4  0x00007f5de4832c03 in std::terminate() () from /usr/lib64/libstdc++.so.6
    #5  0x00007f5de4832c86 in __cxa_rethrow () from /usr/lib64/libstdc++.so.6
    #6  0x000000000041817c in SharedPtr<TeacherObj, ReferenceCounter, ReleasePolicy<TeacherObj> >::deref (this=0x7f5ddabfcad0)
        at /home/diego/work/branch0901_shengwang/rtqa_center/source/..//source/tmbase/utils/include/SharedPtr.h:356
    #7  0x00000000004177c0 in SharedPtr<TeacherObj, ReferenceCounter, ReleasePolicy<TeacherObj> >::operator-> (this=0x7f5ddabfcad0)
        at /home/diego/work/branch0901_shengwang/rtqa_center/source/..//source/tmbase/utils/include/SharedPtr.h:209
    #8  0x000000000041e7f6 in CmdTcGetMsp::OnCallBack (this=0x7f5db8000cb0, msg=0x7f5db8002b70) at CmdTeacher.cpp:208
    #9  0x000000000040d40a in CommonHandler::OnResponse (this=0x7f5db80043e0, response=...) at BaseMsg.cpp:77
    #10 0x000000000040e672 in client::replyhandle (req=0x7f5db8001400, arg=0x7f5db80043e0) at client.cpp:42
    #11 0x00007f5de4ec4b41 in evhttp_connection_done (evcon=0x7f5db8000f00) at http.c:817
    #12 0x00007f5de4ec5158 in evhttp_read_body (evcon=0x7f5db8000f00, req=0x7f5db8001400) at http.c:964
    #13 0x00007f5de4ec5858 in evhttp_get_body (evcon=0x7f5db8000f00, req=0x7f5db8001400) at http.c:1969
    #14 0x00007f5de4eb4ee5 in bufferevent_readcb (fd=<value optimized out>, event=<value optimized out>, arg=0x7f5db8001090) at bufferevent_sock.c:186
    #15 0x00007f5de4eace0c in event_process_active_single_queue (base=0x1b281a0, flags=0) at event.c:1350
    #16 event_process_active (base=0x1b281a0, flags=0) at event.c:1420
    #17 event_base_loop (base=0x1b281a0, flags=0) at event.c:1621
    #18 0x000000000040e817 in client::httpclient::runeventloop (arg=0x1b281a0) at client.cpp:65
    #19 0x00007f5de4a839d1 in start_thread () from /lib64/libpthread.so.0
    #20 0x00007f5de37ac8fd in clone () from /lib64/libc.so.6
    (gdb) f 8
    #8  0x000000000041e7f6 in CmdTcGetMsp::OnCallBack (this=0x7f5db8000cb0, msg=0x7f5db8002b70) at CmdTeacher.cpp:208
    208     CmdTeacher.cpp: No such file or directory.
            in CmdTeacher.cpp
    (gdb) 
    (gdb) p httpRes
    $1 = (OrderGetMspRes *) 0x7f5db8002b70
    (gdb) p *httpRes
    $2 = {<HttpRespMsg> = {<BaseMsg> = {_vptr.BaseMsg = 0x51e790, msgType = BaseMsg::OR_GET_MSP, errNo = 0, errMsg = ""}, <No data fields>}, errorMsg = "", statuscode = 1, msp = 4, operId = 
        "shengwang"}
    (gdb) p st
    $3 = {_pCounter = 0x7f5db4002b10, _ptr = 0x7f5db4001940}
    (gdb) p *st
    Could not find operator*.
    (gdb) p tc
    $4 = {_pCounter = 0x7f5dcc0017c0, _ptr = 0x0}
    (gdb) 

    我们可以通过  1)  gdb prog_name -> r               用在逐步调试自己的程序时

                        2)  gdb -> attach process_id       正在运行中的后台程序突然卡在了某个地方,先ps再gdb/attach

                        3)  gdb prog_name core              程序core掉了

    三种方式对一个程序进行调试;

    1. thread——gdb 多线程调试命令:

         info threads:           显示当前进程中的线程;

         thread thread_no:  进入线程xx,通常紧接而来的是 bt/f 命令;

    (gdb) info threads
      19 Thread 0x7f9024dfa700 (LWP 26847)  0x00007f9038295ef3 in epoll_wait () from /lib64/libc.so.6
      18 Thread 0x7f901e1fc700 (LWP 26851)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
      17 Thread 0x7f901ffff700 (LWP 26848)  0x00007f9038295ef3 in epoll_wait () from /lib64/libc.so.6
      16 Thread 0x7f9035792700 (LWP 26840)  0x00007f9038295ef3 in epoll_wait () from /lib64/libc.so.6
      15 Thread 0x7f90261fc700 (LWP 26845)  0x00007f903828c0d3 in poll () from /lib64/libc.so.6
      14 Thread 0x7f901f5fe700 (LWP 26849)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
      13 Thread 0x7f9027fff700 (LWP 26842)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
      12 Thread 0x7f90257fb700 (LWP 26846)  0x00007f90395705bc in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
      11 Thread 0x7f9026bfd700 (LWP 26844)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
      10 Thread 0x7f9036b94700 (LWP 26838)  0x00007f903828e373 in select () from /lib64/libc.so.6
      9 Thread 0x7f901cdfa700 (LWP 26853)  0x00007f90395705bc in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
      8 Thread 0x7f90275fe700 (LWP 26843)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
      7 Thread 0x7f9034d91700 (LWP 26841)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
      6 Thread 0x7f9036193700 (LWP 26839)  0x00007f903828e373 in select () from /lib64/libc.so.6
      5 Thread 0x7f903a0ec720 (LWP 26827)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
      4 Thread 0x7f9037595700 (LWP 26837)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
      3 Thread 0x7f901d7fb700 (LWP 26852)  0x00007f903828c0d3 in poll () from /lib64/libc.so.6
      2 Thread 0x7f9037f96700 (LWP 26835)  0x00007f9038259a3d in nanosleep () from /lib64/libc.so.6
    * 1 Thread 0x7f901ebfd700 (LWP 26850)  0x00007f900c129300 in ?? ()

    查看所有线程的调用栈信息 

    (gdb) thread apply all bt
    
    Thread 19 (Thread 0x7f45f72a2700 (LWP 27863)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f75658b0 in sleep () from /lib64/libc.so.6
    #2  0x00000000005035f8 in TTLogEx::WriteLogThread (ptr=0x0) at TTLogEx.cpp:61
    #3  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b82d00) at thread.cpp:125
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 18 (Thread 0x7f45f68a1700 (LWP 27865)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f75658b0 in sleep () from /lib64/libc.so.6
    #2  0x00000000005048e0 in TTLogOp::WriteLogThread (ptr=0x0) at TTLogOp.cpp:62
    #3  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b8ac70) at thread.cpp:125
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 17 (Thread 0x7f45f5ea0700 (LWP 27866)):
    #0  0x00007f45f759a373 in select () from /lib64/libc.so.6
    #1  0x00007f45f7cf5fbc in SU_sleep (seconds=1, micro_seconds=0) at ../platform/linux/platform.cpp:369
    #2  0x00007f45f7cf53c0 in SchedManager::run (this=0x1b88410) at su_sched_manager.cpp:177
    #3  0x00007f45f7cf4e6a in run_func (args=0x1b88410) at su_sched_manager.cpp:50
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 16 (Thread 0x7f45f549f700 (LWP 27867)):
    #0  0x00007f45f759a373 in select () from /lib64/libc.so.6
    #1  0x00007f45f7cf5e7f in SU_recvfrom (fd=5, addr=0x7f45f549ee30, buf=0x7f45f00008c0, len=1376, ms=5) at ../platform/linux/platform.cpp:340
    #2  0x00007f45f7cf26d4 in SchedRPC::run (this=0x1b8a280) at su_sched.cpp:328
    #3  0x00007f45f7cf1a27 in rpc_func (args=0x1b8a280) at su_sched.cpp:47
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 15 (Thread 0x7f45effff700 (LWP 27868)):
    #0  0x00007f45f75a1ef3 in epoll_wait () from /lib64/libc.so.6
    #1  0x00007f45f8cb5326 in epoll_dispatch (base=0x1b851c0, tv=<value optimized out>) at epoll.c:407
    #2  0x00007f45f8ca3ac6 in event_base_loop (base=0x1b851c0, flags=0) at event.c:1607
    #3  0x000000000040e9a7 in client::httpclient::runeventloop (arg=0x1b851c0) at client.cpp:65
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    ---Type <return> to continue, or q <return> to quit---  
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 14 (Thread 0x7f45ef5fe700 (LWP 27869)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f75658b0 in sleep () from /lib64/libc.so.6
    #2  0x000000000042d944 in ThreadDistribute (para=0x0) at OrderManager.cpp:1054
    #3  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b868d0) at thread.cpp:125
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 13 (Thread 0x7f45eebfd700 (LWP 27870)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f75658b0 in sleep () from /lib64/libc.so.6
    #2  0x000000000042d987 in ThreadTimer (para=0x0) at OrderManager.cpp:1067
    #3  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b84b80) at thread.cpp:125
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 12 (Thread 0x7f45ee1fc700 (LWP 27871)):
    #0  0x00007f45f75980d3 in poll () from /lib64/libc.so.6
    #1  0x000000000052f6c2 in do_io (v=0x7f45e80018d0) at src/mt_adaptor.c:387
    #2  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #3  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 11 (Thread 0x7f45ed7fb700 (LWP 27872)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f75658b0 in sleep () from /lib64/libc.so.6
    #2  0x00000000004908a7 in ThreadStudentDelayDel (para=0x0) at StudentManager.cpp:30
    #3  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b86e80) at thread.cpp:125
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 10 (Thread 0x7f45ecdfa700 (LWP 27873)):
    #0  0x00007f45f887e5bc in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
    #1  0x000000000052f4ab in do_completion (v=0x7f45e80018d0) at src/mt_adaptor.c:463
    #2  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #3  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 9 (Thread 0x7f45dbfff700 (LWP 27874)):
    ---Type <return> to continue, or q <return> to quit---
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f75658b0 in sleep () from /lib64/libc.so.6
    #2  0x00000000004e3b81 in ThreadTeacher (para=0x0) at TeacherManager.cpp:29
    #3  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b8e390) at thread.cpp:125
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 8 (Thread 0x7f45db5fe700 (LWP 27875)):
    #0  0x00007f45f75a1ef3 in epoll_wait () from /lib64/libc.so.6
    #1  0x00007f45f8cb5326 in epoll_dispatch (base=0x1b85820, tv=<value optimized out>) at epoll.c:407
    #2  0x00007f45f8ca3ac6 in event_base_loop (base=0x1b85820, flags=0) at event.c:1607
    #3  0x000000000051012a in TTLibEvent::RunEventLoop (ptr=0x1b85820) at TTLibEvent.cpp:49
    #4  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b857f0) at thread.cpp:125
    #5  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #6  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 7 (Thread 0x7f45dabfd700 (LWP 27876)):
    #0  0x00007f45f75a1ef3 in epoll_wait () from /lib64/libc.so.6
    #1  0x00007f45f8cb5326 in epoll_dispatch (base=0x1b8ca30, tv=<value optimized out>) at epoll.c:407
    #2  0x00007f45f8ca3ac6 in event_base_loop (base=0x1b8ca30, flags=0) at event.c:1607
    #3  0x000000000051012a in TTLibEvent::RunEventLoop (ptr=0x1b8ca30) at TTLibEvent.cpp:49
    #4  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b88ac0) at thread.cpp:125
    #5  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #6  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 6 (Thread 0x7f45da1fc700 (LWP 27877)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f759abe4 in usleep () from /lib64/libc.so.6
    #2  0x0000000000505c2f in TTWorkThread::run (this=0x1b83cc0) at TTServiceManager.cpp:52
    #3  0x0000000000513b12 in Thread::runnable_entry (pThread=0x1b83cc0) at thread.cpp:99
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 5 (Thread 0x7f45d97fb700 (LWP 27878)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f759abe4 in usleep () from /lib64/libc.so.6
    #2  0x0000000000505c2f in TTWorkThread::run (this=0x1b8f5e0) at TTServiceManager.cpp:52
    #3  0x0000000000513b12 in Thread::runnable_entry (pThread=0x1b8f5e0) at thread.cpp:99
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    ---Type <return> to continue, or q <return> to quit---
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 4 (Thread 0x7f45d8dfa700 (LWP 27879)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f759abe4 in usleep () from /lib64/libc.so.6
    #2  0x0000000000505dff in TTServiceManager::RunEventThread (ptr=0x0) at TTServiceManager.cpp:100
    #3  0x0000000000513bbc in Thread::callable_entry (pThread=0x1b8f750) at thread.cpp:125
    #4  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #5  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 3 (Thread 0x7f45c3fff700 (LWP 27880)):
    #0  0x00007f45f75980d3 in poll () from /lib64/libc.so.6
    #1  0x000000000052f6c2 in do_io (v=0x1ba0410) at src/mt_adaptor.c:387
    #2  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #3  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 2 (Thread 0x7f45c35fe700 (LWP 27881)):
    #0  0x00007f45f887e5bc in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
    #1  0x000000000052f4ab in do_completion (v=0x1ba0410) at src/mt_adaptor.c:463
    #2  0x00007f45f887a9d1 in start_thread () from /lib64/libpthread.so.0
    #3  0x00007f45f75a18fd in clone () from /lib64/libc.so.6
    
    Thread 1 (Thread 0x7f45f93fa720 (LWP 27852)):
    #0  0x00007f45f7565a3d in nanosleep () from /lib64/libc.so.6
    #1  0x00007f45f75658b0 in sleep () from /lib64/libc.so.6
    #2  0x0000000000424952 in main (argc=2, argv=0x7fffb45355c8) at main.cpp:166
    一、多线程调试
    1. 多线程调试,最重要的几个命令:
    info threads                        查看当前进程的线程。
                                              GDB会为每个线程分配一个ID, 后面操作线程的时候会用到这个ID.
                                              前面有*的是当前调试的线程.
    thread                      切换调试的线程为指定ID的线程。
    break file.c:100 thread all    在file.c文件第100行处为所有经过这里的线程设置断点。
    set scheduler-locking off|on|step    
          在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,
          怎么只让被调试程序执行呢?
          通过这个命令就可以实现这个需求。
             off      不锁定任何线程,也就是所有线程都执行,这是默认值。
             on       只有当前被调试程序会执行。
             step     在单步的时候,除了next过一个函数的情况
                      (熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,
                      只有当前线程会执行。
    thread apply ID1 ID2 command        让一个或者多个线程执行GDB命令command
    thread apply all command            让所有被调试线程执行GDB命令command。
    
    2. 使用示例:
    线程产生通知:在产生新的线程时, gdb会给出提示信息
    (gdb) r
    Starting program: /root/thread 
    [New Thread 1073951360 (LWP 12900)] 
    [New Thread 1082342592 (LWP 12907)]---以下三个为新产生的线程
    [New Thread 1090731072 (LWP 12908)]
    [New Thread 1099119552 (LWP 12909)]
    
    查看线程:使用info threads可以查看运行的线程。
    (gdb) info threads
      4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
      3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
      2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
    * 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
    (gdb)
    注意,行首为gdb分配的线程ID号,对线程进行切换时,使用该ID号码。
    另外,行首的星号标识了当前活动的线程
    切换线程:
    使用 thread THREADNUMBER 进行切换,THREADNUMBER 为上文提到的线程ID号。
    下例显示将活动线程从 1 切换至 4。
    (gdb) info threads
       4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
       3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
       2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
    * 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
    (gdb) thread 4
    [Switching to thread 4 (Thread 1099119552 (LWP 12940))]#0   0xffffe002 in ?? ()
    (gdb) info threads
    * 4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
       3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
       2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
       1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
    (gdb)
    以上即为使用gdb提供的对多线程进行调试的一些基本命令。
    另外,gdb也提供对线程的断点设置以及对指定或所有线程发布命令的命令
    
    二、调试宏
    在GDB下, 我们无法print宏定义,因为宏是预编译的。
    但是我们还是有办法来调试宏,这个需要GCC的配合。
    在GCC编译程序的时候,加上
      -ggdb3   参数,这样,你就可以调试宏了。
    
    另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。
    info macro   查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
    macro         查看宏展开的样子。
    
    三、源文件
    GDB时,提示找不到源文件。
    需要做下面的检查:
    编译程序员是否加上了 -g参数 以包含debug信息。
    路径是否设置正确了。
    使用GDB的directory命令来设置源文件的目录。
    
    下面给一个调试/bin/ls的示例(ubuntu下)
    $ apt-get source coreutils
    $ sudo apt-get install coreutils-dbgsym
    $ gdb /bin/ls
    GNU gdb (GDB) 7.1-ubuntu
    (gdb) list main
    1192    ls.c: No such file or directory.
    in ls.c
    (gdb) directory ~/src/coreutils-7.4/src/
    Source directories searched: /home/hchen/src/coreutils-7.4:$cdir:$cwd
    (gdb) list main
    1192        }
    1193    }
    1194
    1195    int
    1196    main (int argc, char **argv)
    1197    {
    1198      int i;
    1199      struct pending *thispend;
    1200      int n_files;
    1201
    
    四、条件断点
    条件断点是语法是:
      break  [where] if [condition]
    这种断点真是非常管用。
    尤其是在一个循环或递归中,或是要监视某个变量。
    注意,这个设置是在GDB中的,只不过每经过那个断点时GDB会帮你检查一下条件是否满足。
    
    五、命令行参数
    有时候,我们需要调试的程序需要有命令行参数, 有三种方法:
    gdb命令行的 -args 参数
    gdb环境中   set args命令。
    gdb环境中   run 参数
    
    六、gdb的变量
    有时候,在调试程序时,我们不单单只是查看运行时的变量,
    我们还可以直接设置程序中的变量,以模拟一些很难在测试中出现的情况,比较一些出错,
    或是switch的分支语句。使用set命令可以修改程序中的变量。
    另外,你知道gdb中也可以有变量吗?
    就像shell一样,gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:
    (gdb) set $i = 0
    (gdb) p a[$i++]
    ...  #然后就一路回车下去了
    当然,这里只是给一个示例,表示程序的变量和gdb的变量是可以交互的。
    
    七、x命令
    也许,你很喜欢用p命令。
    所以,当你不知道变量名的时候,你可能会手足无措,因为p命令总是需要一个变量名的。
    x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。
    x/x 以十六进制输出
    x/d 以十进制输出
    x/c 以单字符输出
    x/i  反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
    x/s 以字符串输出
    
    八、command命令
    如何自动化调试。
    这里向大家介绍command命令,简单的理解一下,其就是把一组gdb的命令打包,有点像字处理软件的“宏”。
    下面是一个示例:
    (gdb) break func
    Breakpoint 1 at 0x3475678: file test.c, line 12.
    (gdb) command 1
    Type commands for when breakpoint 1 is hit, one per line.
    End with a line saying just "end".
    >print arg1
    >print arg2
    >print arg3
    >end
    (gdb)
    当我们的断点到达时,自动执行command中的三个命令,把func的三个参数值打出来。

    使用gdb ctrl 是有时候会报错,找不到相应的so文件,这个时候可以这样做

    1 编辑/etc/ld.so.conf 文件,将so所在的位置加到/etc/ld.so.conf文件中。

    2 ldconfig ,使之生效。

     ldconfig是一个动态链接库管理命令

      为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig

      ldconfig  命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为  /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.

      ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.

  • 相关阅读:
    面向对象之三个基本特征(javaScript)
    webpack初探
    浅谈Promise
    Vue Mixin 与微信小程序 Mixins 应用
    C#入门基础语法知识点总结(变量、运算符、类型转换)
    C#入门基础语法知识点总结(.NET开发环境及代码编写规范)
    触发器练习三
    触发器练习二
    触发器练习一
    存储过程练习二
  • 原文地址:https://www.cnblogs.com/diegodu/p/4792809.html
Copyright © 2011-2022 走看看