Linux 10個幫助你調試的命令

文章目錄

  • #file

  • #ldd

  • #ltrace

  • #hexdump

  • #strings

  • #readelf

  • #objdump

  • #strace

  • #nm

  • #gdb

磨刀不誤砍柴工,Linux下也是一樣,你掌握了正確的調試手段,對你的開發會非常有幫助。總結的這幾個命令非常經典。

#file

這個命令可以查看文件的確切文件類型

#ldd

如何找到可執行文件所依賴的庫?這就是ldd命令出現的原因,有人的地方就有江湖,有需要我的地方就應該出現我。針對動態鏈接的二進制文件運行它會顯示其所有依賴的庫及其路徑。

#ltrace

這個命令可以追蹤命令運行的時候跑了哪些函數,可以作爲堆棧調用跟蹤調試使用。ltrace能夠跟蹤進程的庫函數調用,它會顯現出哪個庫函數被調用。

詳細鏈接:

https://www.cnblogs.com/machangwei-8/p/10388938.html

-a 對齊具體某個列的返回值。
-c 計算時間和調用,並在程序退出時打印摘要。
-C 解碼低級別名稱(內核級)爲用戶級名稱。
-d 打印調試信息。
-e 改變跟蹤的事件。
-f 跟蹤子進程。
-h 打印幫助信息。
-i 打印指令指針,當庫調用時。
-l 只打印某個庫中的調用。
-L 不打印庫調用。
-n, --indent=NR 對每個調用級別嵌套以NR個空格進行縮進輸出。
-o, --output=file 把輸出定向到文件。
-p PID 附着在值爲PID的進程號上進行ltrace。
-r 打印相對時間戳。
-s STRLEN 設置打印的字符串最大長度。
-S 顯示系統調用。
-t, -tt, -ttt 打印絕對時間戳。
-T 輸出每個調用過程的時間開銷。
-u USERNAME 使用某個用戶id或組ID來運行命令。
-V, --version 打印版本信息,然後退出。
-x NAME treat the global NAME like a library subroutine.
weiqifa0@weiqifa-System-Product-Name:~$ ltrace ls
strrchr("ls", '/')                                                     = nil
setlocale(LC_ALL, "")                                                  = "zh_CN.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale")                       = "/usr/share/locale"
textdomain("coreutils")                                                = "coreutils"
__cxa_atexit(0x5594e2fd9ca0, 0, 0x5594e31ed008, 0x736c6974756572)      = 0
isatty(1)                                                              = 1
getenv("QUOTING_STYLE")                                                = nil
getenv("COLUMNS")                                                      = nil
ioctl(1, 21523, 0x7fff061929c0)                                        = 0
getenv("TABSIZE")                                                      = nil
getopt_long(1, 0x7fff06192af8, "abcdfghiklmnopqrstuvw:xABCDFGHI:"..., 0x5594e31ec2e0, -1) = -1
getenv("LS_BLOCK_SIZE")                                                = nil
getenv("BLOCK_SIZE")                                                   = nil
getenv("BLOCKSIZE")                                                    = nil
getenv("POSIXLY_CORRECT")                                              = nil
getenv("BLOCK_SIZE")                                                   = nil
__errno_location()                                                     = 0x7f3801ac0258
memcpy(0x5594e4a91a50, "\003\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 56) = 0x5594e4a91a50
__errno_location()                                                     = 0x7f3801ac0258
memcpy(0x5594e4a91a90, "\003\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 56) = 0x5594e4a91a90
getenv("TZ")                                                           = nil
strlen(".")                                                            = 1
memcpy(0x5594e4a969c0, ".\0", 2)                                       = 0x5594e4a969c0
__errno_location()                                                     = 0x7f3801ac0258
opendir(".")                                                           = 0x5594e4a969e0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96a10
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("Desktop")                                                      = 7
strlen("Desktop")                                                      = 7
memcpy(0x5594e4a9ea20, "Desktop\0", 8)                                 = 0x5594e4a9ea20
readdir(0x5594e4a969e0)                                                = 0x5594e4a96a30
readdir(0x5594e4a969e0)                                                = 0x5594e4a96a50
readdir(0x5594e4a969e0)                                                = 0x5594e4a96a70
readdir(0x5594e4a969e0)                                                = 0x5594e4a96a90
readdir(0x5594e4a969e0)                                                = 0x5594e4a96ab0
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("examples.desktop")                                             = 16
strlen("examples.desktop")                                             = 16
memcpy(0x5594e4a9ea40, "examples.desktop\0", 17)                       = 0x5594e4a9ea40
readdir(0x5594e4a969e0)                                                = 0x5594e4a96ad8
readdir(0x5594e4a969e0)                                                = 0x5594e4a96af8
readdir(0x5594e4a969e0)                                                = 0x5594e4a96b20
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("Public")                                                       = 6
strlen("Public")                                                       = 6
memcpy(0x5594e4a9ea60, "Public\0", 7)                                  = 0x5594e4a9ea60
readdir(0x5594e4a969e0)                                                = 0x5594e4a96b40
readdir(0x5594e4a969e0)                                                = 0x5594e4a96b68
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("Pictures")                                                     = 8
strlen("Pictures")                                                     = 8
memcpy(0x5594e4a9ea80, "Pictures\0", 9)                                = 0x5594e4a9ea80
readdir(0x5594e4a969e0)                                                = 0x5594e4a96b88
readdir(0x5594e4a969e0)                                                = 0x5594e4a96ba8
readdir(0x5594e4a969e0)                                                = 0x5594e4a96bc0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96bd8
readdir(0x5594e4a969e0)                                                = 0x5594e4a96bf8
readdir(0x5594e4a969e0)                                                = 0x5594e4a96c28
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("Videos")                                                       = 6
strlen("Videos")                                                       = 6
memcpy(0x5594e4a9eaa0, "Videos\0", 7)                                  = 0x5594e4a9eaa0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96c48
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("Music")                                                        = 5
strlen("Music")                                                        = 5
memcpy(0x5594e4a9eac0, "Music\0", 6)                                   = 0x5594e4a9eac0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96c68
readdir(0x5594e4a969e0)                                                = 0x5594e4a96c80
readdir(0x5594e4a969e0)                                                = 0x5594e4a96ca0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96cc0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96ce0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96d00
readdir(0x5594e4a969e0)                                                = 0x5594e4a96d20
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("c")                                                            = 1
strlen("c")                                                            = 1
memcpy(0x5594e4a9eae0, "c\0", 2)                                       = 0x5594e4a9eae0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96d38
readdir(0x5594e4a969e0)                                                = 0x5594e4a96d58
readdir(0x5594e4a969e0)                                                = 0x5594e4a96d78
readdir(0x5594e4a969e0)                                                = 0x5594e4a96d98
readdir(0x5594e4a969e0)                                                = 0x5594e4a96db8
readdir(0x5594e4a969e0)                                                = 0x5594e4a96de0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96e00
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("Templates")                                                    = 9
strlen("Templates")                                                    = 9
memcpy(0x5594e4a9eb00, "Templates\0", 10)                              = 0x5594e4a9eb00
readdir(0x5594e4a969e0)                                                = 0x5594e4a96e20
readdir(0x5594e4a969e0)                                                = 0x5594e4a96e48
readdir(0x5594e4a969e0)                                                = 0x5594e4a96e68
readdir(0x5594e4a969e0)                                                = 0x5594e4a96e88
readdir(0x5594e4a969e0)                                                = 0x5594e4a96eb0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96ed0
readdir(0x5594e4a969e0)                                                = 0x5594e4a96ee8
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("Downloads")                                                    = 9
strlen("Downloads")                                                    = 9
memcpy(0x5594e4a9eb20, "Downloads\0", 10)                              = 0x5594e4a9eb20
readdir(0x5594e4a969e0)                                                = 0x5594e4a96f08
__errno_location()                                                     = 0x7f3801ac0258
__ctype_get_mb_cur_max()                                               = 6
strlen("Documents")                                                    = 9
strlen("Documents")                                                    = 9
memcpy(0x5594e4a9eb40, "Documents\0", 10)                              = 0x5594e4a9eb40
readdir(0x5594e4a969e0)                                                = 0
closedir(0x5594e4a969e0)                                               = 0
_setjmp(0x5594e31ed300, 0x7f3801f3f3f0, 0x5594e4a96a30, 0x5594e4a92330) = 0
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Downloads", "Documents")                                      = 4
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Templates", "Documents")                                      = 3
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Templates", "Downloads")                                      = 3
memcpy(0x5594e4a96a28, "\330 \251\344\224U\0\0", 8)                    = 0x5594e4a96a28
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Music", "c")                                                  = 1
memcpy(0x5594e4a96a38, "H\037\251\344\224U\0\0", 8)                    = 0x5594e4a96a38
__errno_location()                                                     = 0x7f3801ac0258
strcoll("c", "Documents")                                              = -9
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Music", "Documents")                                          = 1
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Music", "Downloads")                                          = 1
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Music", "Templates")                                          = -2
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Pictures", "Videos")                                          = -2
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Public", "Pictures")                                          = 2
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Public", "Videos")                                            = -2
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Desktop", "examples.desktop")                                 = -12
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Desktop", "Pictures")                                         = -2
__errno_location()                                                     = 0x7f3801ac0258
strcoll("examples.desktop", "Pictures")                                = -2
memcpy(0x5594e4a96a40, "\270\035\251\344\224U\0\0\360\034\251\344\224U\0\0\200\036\251\344\224U\0\0", 24) = 0x5594e4a96a40
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Desktop", "c")                                                = 9
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Desktop", "Documents")                                        = -2
__errno_location()                                                     = 0x7f3801ac0258
strcoll("examples.desktop", "Documents")                               = 12
__errno_location()                                                     = 0x7f3801ac0258
strcoll("examples.desktop", "Downloads")                               = 12
__errno_location()                                                     = 0x7f3801ac0258
strcoll("examples.desktop", "Music")                                   = -1
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Pictures", "Music")                                           = 1
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Pictures", "Templates")                                       = -1
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Public", "Templates")                                         = -1
__errno_location()                                                     = 0x7f3801ac0258
strcoll("Videos", "Templates")                                         = 1
memcpy(0x5594e4a96a28, "\200\036\251\344\224U\0\0", 8)                 = 0x5594e4a96a28
realloc(0, 480)                                                        = 0x5594e4a96ae0
strlen("c")                                                            = 1
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Desktop")                                                      = 7
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Documents")                                                    = 9
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Downloads")                                                    = 9
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("examples.desktop")                                             = 16
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Music")                                                        = 5
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Pictures")                                                     = 8
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Public")                                                       = 6
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Templates")                                                    = 9
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Videos")                                                       = 6
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("c")                                                            = 1
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("c")                                                            = 1
fwrite_unlocked("c", 1, 1, 0x7f3801f3f760)                             = 1
__overflow(0x7f3801f3f760, 32, 2, 8)                                   = 32
__overflow(0x7f3801f3f760, 32, 3, 8)                                   = 32
strlen("Desktop")                                                      = 7
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Desktop")                                                      = 7
fwrite_unlocked("Desktop", 1, 7, 0x7f3801f3f760)                       = 7
__overflow(0x7f3801f3f760, 32, 3, 8)                                   = 32
__overflow(0x7f3801f3f760, 32, 4, 8)                                   = 32
strlen("Documents")                                                    = 9
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Documents")                                                    = 9
fwrite_unlocked("Documents", 1, 9, 0x7f3801f3f760)                     = 9
__overflow(0x7f3801f3f760, 32, 6, 8)                                   = 32
__overflow(0x7f3801f3f760, 32, 7, 8)                                   = 32
strlen("Downloads")                                                    = 9
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Downloads")                                                    = 9
fwrite_unlocked("Downloads", 1, 9, 0x7f3801f3f760)                     = 9
__overflow(0x7f3801f3f760, 32, 1, 8)                                   = 32
__overflow(0x7f3801f3f760, 32, 2, 8)                                   = 32
strlen("examples.desktop")                                             = 16
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("examples.desktop")                                             = 16
fwrite_unlocked("examples.desktop", 1, 16, 0x7f3801f3f760)             = 16
__overflow(0x7f3801f3f760, 32, 3, 8)                                   = 32
__overflow(0x7f3801f3f760, 32, 4, 8)                                   = 32
strlen("Music")                                                        = 5
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Music")                                                        = 5
fwrite_unlocked("Music", 1, 5, 0x7f3801f3f760)                         = 5
__overflow(0x7f3801f3f760, 32, 2, 8)                                   = 32
__overflow(0x7f3801f3f760, 32, 3, 8)                                   = 32
strlen("Pictures")                                                     = 8
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Pictures")                                                     = 8
fwrite_unlocked("Pictures", 1, 8, 0x7f3801f3f760)                      = 8
__overflow(0x7f3801f3f760, 32, 4, 8)                                   = 32
__overflow(0x7f3801f3f760, 32, 5, 8)                                   = 32
strlen("Public")                                                       = 6
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Public")                                                       = 6
fwrite_unlocked("Public", 1, 6, 0x7f3801f3f760)                        = 6
__overflow(0x7f3801f3f760, 32, 4, 8)                                   = 32
__overflow(0x7f3801f3f760, 32, 5, 8)                                   = 32
strlen("Templates")                                                    = 9
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Templates")                                                    = 9
fwrite_unlocked("Templates", 1, 9, 0x7f3801f3f760)                     = 9
__overflow(0x7f3801f3f760, 9, 7, 8)                                    = 9
strlen("Videos")                                                       = 6
__ctype_get_mb_cur_max()                                               = 6
__ctype_get_mb_cur_max()                                               = 6
strlen("Videos")                                                       = 6
fwrite_unlocked("Videos", 1, 6, 0x7f3801f3f760)                        = 6
__overflow(0x7f3801f3f760, 10, 0x1d15f2f23c04cf00, 0x736f6564c  Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  Templates Videos
)         = 10
__fpending(0x7f3801f3f760, 0, 0x5594e2fd9ca0, 1)                       = 0
fileno(0x7f3801f3f760)                                                 = 1
__freading(0x7f3801f3f760, 0, 0x5594e2fd9ca0, 1)                       = 0
__freading(0x7f3801f3f760, 0, 2052, 1)                                 = 0
fflush(0x7f3801f3f760)                                                 = 0
fclose(0x7f3801f3f760)                                                 = 0
__fpending(0x7f3801f3f680, 0, 0x7f3801f3f960, 3072)                    = 0
fileno(0x7f3801f3f680)                                                 = 2
__freading(0x7f3801f3f680, 0, 0x7f3801f3f960, 3072)                    = 0
__freading(0x7f3801f3f680, 0, 4, 3072)                                 = 0
fflush(0x7f3801f3f680)                                                 = 0
fclose(0x7f3801f3f680)                                                 = 0
+++ exited (status 0) +++
weiqifa0@weiqifa-System-Product-Name:~$

#hexdump

從名字可以看出這個是用來查看文件的十六進制的。

weiqifa0@weiqifa-System-Product-Name:~$ hexdump /bin/ls  |head
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0003 003e 0001 0000 5850 0000 0000 0000
0000020 0040 0000 0000 0000 03a0 0002 0000 0000
0000030 0000 0000 0040 0038 0009 0040 001c 001b
0000040 0006 0000 0005 0000 0040 0000 0000 0000
0000050 0040 0000 0000 0000 0040 0000 0000 0000
0000060 01f8 0000 0000 0000 01f8 0000 0000 0000
0000070 0008 0000 0000 0000 0003 0000 0004 0000
0000080 0238 0000 0000 0000 0238 0000 0000 0000
0000090 0238 0000 0000 0000 001c 0000 0000 0000
weiqifa0@weiqifa-System-Product-Name:~$

#strings

這個之前在文件dts解析裏面有說過,是一個非常不錯的命令,用來查看Bin裏面有什麼字符串。

#readelf

一般用於查看ELF格式的文件信息,常見的文件如在Linux上的可執行文件,動態庫(* .so)或者靜態庫(* .a) 等包含ELF格式的文件。以下命令的使用是基於android編譯出來的so文件上面去運行。

#objdump

這個命令主要用來反彙編格式。

weiqifa0@weiqifa-System-Product-Name:~/c$ cat 1.c
#include "stdio.h"

int main(void)
{
    printf("hello,world\n");
    return (0);
}
weiqifa0@weiqifa-System-Product-Name:~/c$ gcc 1.c -o 1.o
weiqifa0@weiqifa-System-Product-Name:~/c$ objdump -h 1.o

1.o:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  00000000000002a8  00000000000002a8  000002a8  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.gnu.build-id 00000024  00000000000002c4  00000000000002c4  000002c4  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .note.ABI-tag 00000020  00000000000002e8  00000000000002e8  000002e8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .gnu.hash     00000024  0000000000000308  0000000000000308  00000308  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynsym       000000a8  0000000000000330  0000000000000330  00000330  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .dynstr       00000082  00000000000003d8  00000000000003d8  000003d8  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version  0000000e  000000000000045a  000000000000045a  0000045a  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .gnu.version_r 00000020  0000000000000468  0000000000000468  00000468  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .rela.dyn     000000c0  0000000000000488  0000000000000488  00000488  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .rela.plt     00000018  0000000000000548  0000000000000548  00000548  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .init         00000017  0000000000001000  0000000000001000  00001000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 11 .plt          00000020  0000000000001020  0000000000001020  00001020  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .plt.got      00000008  0000000000001040  0000000000001040  00001040  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 13 .text         00000161  0000000000001050  0000000000001050  00001050  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .fini         00000009  00000000000011b4  00000000000011b4  000011b4  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 15 .rodata       00000010  0000000000002000  0000000000002000  00002000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 16 .eh_frame_hdr 0000003c  0000000000002010  0000000000002010  00002010  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 17 .eh_frame     00000108  0000000000002050  0000000000002050  00002050  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 18 .init_array   00000008  0000000000003db8  0000000000003db8  00002db8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 19 .fini_array   00000008  0000000000003dc0  0000000000003dc0  00002dc0  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 20 .dynamic      000001f0  0000000000003dc8  0000000000003dc8  00002dc8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 21 .got          00000048  0000000000003fb8  0000000000003fb8  00002fb8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 22 .data         00000010  0000000000004000  0000000000004000  00003000  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 23 .bss          00000008  0000000000004010  0000000000004010  00003010  2**0
                  ALLOC
 24 .comment      00000023  0000000000000000  0000000000000000  00003010  2**0
                  CONTENTS, READONLY
weiqifa0@weiqifa-System-Product-Name:~/c$

#strace

strace是一個非常簡單的工具,它可以跟蹤系統調用的執行。最簡單的方式,它可以從頭到尾跟蹤binary的執行,然後以一行文本輸出系統調用的名字,參數和返回值。

詳細鏈接:

 

https://blog.csdn.net/uisoul/article/details/83143290

weiqifa0@weiqifa-System-Product-Name:~/c$ strace /bin/ls
execve("/bin/ls", ["/bin/ls"], 0x7ffdb4868620 /* 23 vars */) = 0
brk(NULL)                               = 0x55ebe6544000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=109714, ...}) = 0
mmap(NULL, 109714, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc672283000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 h\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=158928, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc672281000
mmap(NULL, 170192, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc672257000
mprotect(0x7fc67225d000, 131072, PROT_NONE) = 0
mmap(0x7fc67225d000, 98304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fc67225d000
mmap(0x7fc672275000, 28672, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e000) = 0x7fc672275000
mmap(0x7fc67227d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fc67227d000
mmap(0x7fc67227f000, 6352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc67227f000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200l\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2000480, ...}) = 0
mmap(NULL, 2008696, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc67206c000
mmap(0x7fc672091000, 1519616, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fc672091000
mmap(0x7fc672204000, 299008, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x198000) = 0x7fc672204000
mmap(0x7fc67224d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e0000) = 0x7fc67224d000
mmap(0x7fc672253000, 13944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc672253000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \25\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=464824, ...}) = 0
mmap(NULL, 2560264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc671dfa000
mprotect(0x7fc671e6a000, 2097152, PROT_NONE) = 0
mmap(0x7fc67206a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0x7fc67206a000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\21\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=18656, ...}) = 0
mmap(NULL, 20752, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc671df4000
mmap(0x7fc671df5000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7fc671df5000
mmap(0x7fc671df7000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fc671df7000
mmap(0x7fc671df8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fc671df8000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200|\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=149840, ...}) = 0
mmap(NULL, 132288, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc671dd3000
mmap(0x7fc671dda000, 61440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fc671dda000
mmap(0x7fc671de9000, 20480, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fc671de9000
mmap(0x7fc671dee000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a000) = 0x7fc671dee000
mmap(0x7fc671df0000, 13504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc671df0000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc671dd1000
arch_prctl(ARCH_SET_FS, 0x7fc671dd23c0) = 0
mprotect(0x7fc67224d000, 12288, PROT_READ) = 0
mprotect(0x7fc671dee000, 4096, PROT_READ) = 0
mprotect(0x7fc671df8000, 4096, PROT_READ) = 0
mprotect(0x7fc67206a000, 4096, PROT_READ) = 0
mprotect(0x7fc67227d000, 4096, PROT_READ) = 0
mprotect(0x55ebe4612000, 8192, PROT_READ) = 0
mprotect(0x7fc6722c8000, 4096, PROT_READ) = 0
munmap(0x7fc672283000, 109714)          = 0
set_tid_address(0x7fc671dd2690)         = 15038
set_robust_list(0x7fc671dd26a0, 24)     = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7fc671dda6c0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc671de6f40}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7fc671dda760, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fc671de6f40}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7ffdfa4ebb30) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffdfa4ebb30)      = -1 ENOENT (No such file or directory)
brk(NULL)                               = 0x55ebe6544000
brk(0x55ebe6565000)                     = 0x55ebe6565000
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 423
read(3, "", 1024)                       = 0
close(3)                                = 0
access("/etc/selinux/config", F_OK)     = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=8841488, ...}) = 0
mmap(NULL, 8841488, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc671562000
close(3)                                = 0
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=27, ws_col=116, ws_xpixel=0, ws_ypixel=0}) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
fstat(3, {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
getdents64(3, /* 4 entries */, 32768)   = 96
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
write(1, "1.c  1.o\n", 91.c  1.o
)               = 9
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++
weiqifa0@weiqifa-System-Product-Name:~/c$

#nm

這個命令可以看到鏈接庫的地址,實際使用的時候會發現非常爽。

weiqifa0@weiqifa-System-Product-Name:~/c$ cat 1.c
#include "stdio.h"

int main(void)
{
    printf("hello,world\n");
    return (0);
}
weiqifa0@weiqifa-System-Product-Name:~/c$ gcc 1.c  -o 1.o
weiqifa0@weiqifa-System-Product-Name:~/c$ nm 1.o
0000000000004010 B __bss_start
0000000000004010 b completed.7963
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000004000 D __data_start
0000000000004000 W data_start
0000000000001080 t deregister_tm_clones
00000000000010f0 t __do_global_dtors_aux
0000000000003dc0 t __do_global_dtors_aux_fini_array_entry
0000000000004008 D __dso_handle
0000000000003dc8 d _DYNAMIC
0000000000004010 D _edata
0000000000004018 B _end
00000000000011b4 T _fini
0000000000001130 t frame_dummy
0000000000003db8 t __frame_dummy_init_array_entry
0000000000002154 r __FRAME_END__
0000000000003fb8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
0000000000002010 r __GNU_EH_FRAME_HDR
0000000000001000 t _init
0000000000003dc0 t __init_array_end
0000000000003db8 t __init_array_start
0000000000002000 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
00000000000011b0 T __libc_csu_fini
0000000000001150 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
0000000000001135 T main
                 U puts@@GLIBC_2.2.5
00000000000010b0 t register_tm_clones
0000000000001050 T _start
0000000000004010 D __TMC_END__
weiqifa0@weiqifa-System-Product-Name:~/c$

#gdb

gdb我覺得大家應該不會陌生了吧,可以說是Linux下的調試神器了。

weiqifa0@weiqifa-System-Product-Name:~/c$ gcc -c -g 1.c
weiqifa0@weiqifa-System-Product-Name:~/c$ ls
1.c  1.o  -g
weiqifa0@weiqifa-System-Product-Name:~/c$ gcc 1.o -o 1
weiqifa0@weiqifa-System-Product-Name:~/c$ gdb 1
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from 1...done.
(gdb) list
1       #include "stdio.h"
2
3       int main(void)
4       {
5           printf("hello,world\n");
6           return (0);
7       }
(gdb) b main
Breakpoint 1 at 0x1139: file 1.c, line 5.
(gdb) run
Starting program: /home/weiqifa0/c/1

Breakpoint 1, main () at 1.c:5
5           printf("hello,world\n");
(gdb)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章