1       Debugging Information in Separate Files

GDB支持用户将程序调试信息放在一个独立的文件里,而不是和可执行程序在一个文件中,GDB可以某种方式来查找和自动加载调试信息。由于调试信息可能非常大,有时可能比可执行代码自身还要大,某些系统将其可执行程序的调试信息以单独的文件发布,在需要调试问题的时候,用户可以再安装这些文件。

GDB支持两种设置单独调试信息文件的方式:

  1. 可执行程序里包含了一个调试链接,此链接指定了单独的调试信息文件名。单独调试文件名通常是’executable.debug’, executable是相应的可执行程序名,不带路径(例如,’ls.debug’是’/usr/bin/ls’的调试信息文件)。此外,调试链接为调试 文件设置了CRC32的校验和,GDB用此校验和来确保可执行文件和调试文件是同一个版本的。
  2. 可执行文件包含一个版本ID号和一个唯一的bit串,而相应的调试信息文件也包含此bit串。(此方式只在某些系统上支持,特别是那些在二进制文件里使用ELF格式和GNU Binutils的系统。)更多关于此功能的细节,参见’–build-id’命令行选项的介绍 ,在GNU连接器的“命令行选项”节中。虽然版本ID号没有执行指出调试信息文件名,但是可以从版本ID号里计算出来,参见下 面。

由于有两种方法可以设置调试信息文件,GDB也用两种不同的方式查找调试信息文件:

  1. 对于“调试链接”方式,GDB在可执行文件的目录里查找对应名字的文件,接着在此目录下的子目录’.debug’下查找,最后在全局调试目录下的一个子目录里查找,此子目录的名字和可执行文件的绝对文件名的先导目录名相同。
  2. 对于“版本ID”方式,GDB在全局调试目录下的’.build-id’子目录下查找名为’nn/nnnnnnnn.debug’的文件,这里nn是版本ID字符串的头两个16进制字符,nnnnnnnn是余下的字符。(真正的版本ID字符串是32个或更多的16进制字符,不是10个。)

举个例子,假设你要调试’/usr/bin/ls’,此程序有个调试链接指定了调试文件’ls.debug’,且其版本ID是是16进制的abcdef1234。如果全局调试目录是’/usr/lib/debug’,那么GDB按顺序查找下列调试信息文件:

–‘/usr/lib/debug/.build-id/ab/cdef1234.debug’

–‘/usr/bin/ls.debug’

–‘/usr/bin/.debug/ls.debug’

–‘/usr/lib/debug/usr/bin/ls.debug’.

你可以设置全局调试信息目录的名称,并查看当前GDB所使用的名称。

  • set debug-file-directory directory

将directory设置为GDB搜索单独调试信息文件的目录。

  • show debug-file-directory

显示搜索单独调试信息文件的目录。

2       gdb 调试与符号表分离的二进制程序

一般情况下,如果没有在程序的 spec 中明确指定不进行 strip,则缺省打rpm包时,都会把二进制程序或动态库的符号表等 debuginfo 信息与执行程序分离,生成一个debuginfo 的 rpm 包. 如 localagent 打 rpm 包时,会生成如下 3 个rpm 包:

  • local_agent-0.7.1-rc_1.x86_64.rpm
  • local_agent-debuginfo-0.7.1-rc_1.x86_64.rpm
  • local_agent-devel-0.7.1-rc_1.x86_64.rpm

将 local_agent-debuginfo-0.7.1-rc_1.x86_64.rpm 解压,可以看到相应的 debug info 文件.

[tmp]$ rpm2cpio local_agent-debuginfo-0.7.1-rc_1.x86_64.rpm |cpio –idv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
./usr/local/bin/.debug/local_agent_client.debug
  
./usr/local/bin/.debug/local_agent_server.debug
  
./usr/local/lib64/.debug/liblocal_agent.so.debug
  
./usr/src/debug/local_agent-0.7.1
  
./usr/src/debug/local_agent-0.7.1/build
  
./usr/src/debug/local_agent-0.7.1/build/release64
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/ClientParamParser.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/FileUtil.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/LocalAgent.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/LocalAgentClient.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/LocalAgentClientMain.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/LocalAgentMain.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/LocalAgentServerAdapter.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/ServerParamParser.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/SystemWrapper.cpp
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/local_agent.pb.cc
  
./usr/src/debug/local_agent-0.7.1/build/release64/local_agent/local_agent.pb.h
  
./usr/src/debug/local_agent-0.7.1/local_agent
  
./usr/src/debug/local_agent-0.7.1/local_agent/AgentErrorDefine.h
  
./usr/src/debug/local_agent-0.7.1/local_agent/ClientParamParser.h
  
./usr/src/debug/local_agent-0.7.1/local_agent/FileUtil.h
  
./usr/src/debug/local_agent-0.7.1/local_agent/LocalAgent.h
  
./usr/src/debug/local_agent-0.7.1/local_agent/LocalAgentClient.h
  
./usr/src/debug/local_agent-0.7.1/local_agent/LocalAgentServerAdapter.h
  
./usr/src/debug/local_agent-0.7.1/local_agent/ServerParamParser.h
  
./usr/src/debug/local_agent-0.7.1/local_agent/SystemWrapper.h

 对于这种符号表与二进程序分离的程序,该如何调试呢? 先看下例:   [local]$ gdb bin/local_agent_server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
GNU gdb Fedora (6.8-37.el5)
  
Copyright (C) 2008 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-redhat-linux-gnu"...
  
(no debugging symbols found)
  
(gdb) b main
  
Breakpoint 1 at 0x401a80
  
(gdb) r
  
Starting program: /home/admin/tmp/usr/local/bin/local_agent_server
  
[Thread debugging using libthread_db enabled]
  
[New Thread 0x2ad3e6935860 (LWP 27869)]
  
Breakpoint 1, 0x0000000000401a80 in main ()
  
(gdb) bt
  
#0  0x0000000000401a80 in main ()
  
(gdb)

 上述例子可以看出,因为gdb 没有符号表,所以显示的都是二进制地址.

2.1  方法一: gdb 启动时通过 –s 指定

对于这种符号表与二进程序,可以在gdb 启动时,通过 –s 指定符号表文件来解决. 如下例,通过 –s 指定debug/local_agent_server.debug 后, gdb 调试时可以看到符号表了.
[ local]$ gdb -e bin/local_agent_server -s debug/local_agent_server.debug
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
GNU gdb Fedora (6.8-37.el5)
  
Copyright (C) 2008 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-redhat-linux-gnu"...
  
(gdb) b main
  
Breakpoint 1 at 0x401a80: file build/release64/local_agent/LocalAgentMain.cpp, line 34.
  
(gdb) bt
  
No stack.
  
(gdb) r
  
Starting program: /home/admin/tmp/usr/local/bin/local_agent_server
  
[Thread debugging using libthread_db enabled]
  
[New Thread 0x2af3399a7860 (LWP 27862)]
  
Breakpoint 1, main (argc=1, argv=0x7fff5728f0b8) at build/release64/local_agent/LocalAgentMain.cpp:34
  
34      build/release64/local_agent/LocalAgentMain.cpp: No such file or directory.
  
in build/release64/local_agent/LocalAgentMain.cpp
  
(gdb) quit

如果是这种符号表与二进程序分离的程序进行所产生的 core ,可以通过如下方式调试:
gdb -c core.1234 -e bin/local_agent_server -s debug/local_agent_server.debug
其中:
  • -c 指定core文件
  • -e 指定binary,用线上的binary即可
  • -s 指定符号表,也就是我们新生成的符号表

2.2  方法二: 将 .debug 目录放到可执行程序所在的目录

除了通过 –s 指定 debuginfo 文件外,还可以将 .debug 目录复制到可执行程序所在的目录或者将 local_agent_server.debug 复制到可执行程序所在的目录.
[admin@s002182.cm6 local]$ pwd  /home/admin/tmp/usr/local
[admin@s002182.cm6 local]$ cp -r debug/ bin/.debug
[admin@s002182.cm6 local]$ ls -lha bin/
1
2
3
4
5
6
7
8
9
10
11
12
total 44K
drwxr-xr-x 3 admin admin 4.0K Mar 21 18:41 .
 drwxr-xr-x 6 admin admin 4.0K Mar 21 17:47 ..
drwxr-xr-x 3 admin admin 4.0K Mar 21 18:49 .debug
-rwxr-xr-x 1 admin admin  14K Mar 21 17:44 local_agent_client
-rwxr-xr-x 1 admin admin  14K Mar 21 17:44 local_agent_server

此时,也可以看到符号表了.
[local]$ gdb bin/local_agent_server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GNU gdb Fedora (6.8-37.el5)
  
Copyright (C) 2008 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-redhat-linux-gnu"...
  
(gdb) b main
  
Breakpoint 1 at 0x401a80: file build/release64/local_agent/LocalAgentMain.cpp, line 34.
  
(gdb) q


2.3  Set debug-file-directory 方式不生效

尝试用 set debug-file-directory 方式来设置 debug 路径,好像不生效.
[admin@s002182.cm6 local]$ gdb bin/local_agent_server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
GNU gdb Fedora (6.8-37.el5)
  
Copyright (C) 2008 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-redhat-linux-gnu"...
  
(no debugging symbols found)
  
(gdb) b main
  
Breakpoint 1 at 0x401a80
  
(gdb) show debug-file-directory
  
The directory where separate debug symbols are searched for is "/usr/lib/debug".
  
(gdb) set debug-file-directory /usr/lib/debug:/home/admin/tmp/usr/local/debug
  
(gdb) show debug-file-directory
  
The directory where separate debug symbols are searched for is "/usr/lib/debug:/home/admin/tmp/usr/local/debug".
  
(gdb) shell ls -lh /home/admin/tmp/usr/local/debug
  
total 416K
  
-rwxr-xr-x 1 admin admin 203K Mar 21 17:44 local_agent_client.debug
  
-rwxr-xr-x 1 admin admin 201K Mar 21 17:44 local_agent_server.debug
  
(gdb) r
  
Starting program: /home/admin/tmp/usr/local/bin/local_agent_server
  
(no debugging symbols found)
  
[Thread debugging using libthread_db enabled]
  
[New Thread 0x2b5703177860 (LWP 29389)]
  
Breakpoint 1, 0x0000000000401a80 in main ()
  
(gdb)


3       gdb 调试与符号表分离的动态库

如果二进制程序所依赖的动态库是符号表等调试信息与动态库二进制分离的,那又该如何让 gdb 加载这些动态库的符号表呢?

3.1.1   可执行程序运行时,依赖的动态库是通过 rpm 包安装的情况

这种比较简单,只要将 debuginfo 的 rpm 包将通过 rpm 安装即可,因为.debug 目录缺省会安装在 动态库所在的目录下. 下面的 anet 库的rpm 包解压后,可以清楚的看到这一点.
[admin@s002182.cm6 tmp]$ rpm2cpio anet-1.3.2-rc_2.x86_64.rpm |cpio -idv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
./usr/local/lib64/libanet.so
  
./usr/local/lib64/libanet.so.3
  
./usr/local/lib64/libanet.so.3.0.0
  
563 blocks
  
[admin@s002182.cm6 tmp]$ rpm2cpio anet-debuginfo-1.3.2-rc_2.x86_64.rpm |cpio -idv
  
./usr/local/lib64/.debug/libanet.so.3.0.0.debug
  
./usr/src/debug/anet-1.3.2
  
./usr/src/debug/anet-1.3.2/anet
  
./usr/src/debug/anet-1.3.2/anet/addrspec.h
  
./usr/src/debug/anet-1.3.2/anet/adminclient.h
  
./usr/src/debug/anet-1.3.2/anet/admincmds.h
  
./usr/src/debug/anet-1.3.2/anet/adminserver.h
  
./usr/src/debug/anet-1.3.2/anet/advancepacket.h
  
./usr/src/debug/anet-1.3.2/anet/advancepacketfactory.h
  
./usr/src/debug/anet-1.3.2/anet/anet.h
  
./usr/src/debug/anet-1.3.2/anet/aneterror.h
  
./usr/src/debug/anet-1.3.2/anet/appadapter.h


3.1.2   可执行程序运行时,依赖的动态库是通过 rpm2cipo 解压到某个目录的情况

如果可执行程序运行时,依赖的动态库是用户自已通过 rpm2cpio 解压后复制到某个用户自定义的目录的,那么,拿到该动态库的 debuginfo rpm 后,也相应的用 rpm2cpio 解压,并把 .debug 目录复制到相应的动态库所在的目录.
如下面sap_server的示例, sap_server 依赖 libarpc.so.1,但 libarpc.so.1 在打是将 rpm 包时, 其debuginfo 信息分离在单独的 debuginfo rpm 包中的. 所以导致 gdb core时,看不到 libarpc.so.1 的符号表.
gdb bin/sap_server_d core.17131
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(gdb) bt
  
#0  0x0000003959230265 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
  
#1  0x0000003959231d10 in abort () at abort.c:88
  
#2  0x000000395d6bec44 in __gnu_cxx::__verbose_terminate_handler () at ../../../../libstdc++-v3/libsupc++/vterminate.cc:97
  
#3  0x000000395d6bcdb6 in __cxxabiv1::__terminate (handler=<value optimized out>)
  
at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:43
  
#4  0x000000395d6bcde3 in std::terminate () at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:53
  
#5  0x000000395d6bd2ef in __cxa_pure_virtual () at ../../../../libstdc++-v3/libsupc++/pure.cc:55
  
#6  0x00002b8729bfc933 in arpc::ClientPacketHandler::handlePacket () from /home/admin/sap/lib/libarpc.so.1
  
#7  0x00002b872a0ddcd8 in anet::Connection::handlePacket () from /home/admin/sap/lib/libanet.so.3
  
#8  0x00002b872a0e75fb in anet::TCPConnection::readData () from /home/admin/sap/lib/libanet.so.3
  
#9  0x00002b872a0e624b in anet::TCPComponent::handleReadEvent () from /home/admin/sap/lib/libanet.so.3
  
#10 0x00002b872a0e8c0b in anet::Transport::eventIteration () from /home/admin/sap/lib/libanet.so.3
  
#11 0x00002b872a0e8cf2 in anet::Transport::eventLoop () from /home/admin/sap/lib/libanet.so.3
  
#12 0x00002b872a0e8d47 in anet::Transport::run () from /home/admin/sap/lib/libanet.so.3
  
#13 0x00002b872a0ea02d in anet::Thread::hook () from /home/admin/sap/lib/libanet.so.3
  
#14 0x0000003959e064a7 in start_thread (arg=<value optimized out>) at pthread_create.c:297
  
#15 0x00000039592d3c2d in clone () from /lib64/libc.so.6
  
(gdb) thread 2

要让 gdb 调试 core 时,能显示 动态库的符号表,可以用如下方法:
a). 先解压 debuginfo  rpm 包
1
2
rpm2cpio arpc-debuginfo-0.14.1-rc_1.x86_64.rpm |cipo -idv
b).  将 ./usr/local/lib64/.debug 复制到  libarpc.so.1 所在目录:
1
2
/home/admin/sap/lib/  cp -r  ./usr/local/lib64/.debug  /home/admin/sap/lib/
[admin@s007238.cm6 sap]$ gdb bin/sap_server_d core.17131
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
GNU gdb Fedora (6.8-37.el5)
  
Copyright (C) 2008 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-redhat-linux-gnu"...
  
Reading symbols from /home/admin/sap/lib/libhb_node.so...done.
  
Loaded symbols for /home/admin/sap/lib/libhb_node.so
  
Reading symbols from /home/admin/sap/lib/libcm_basic.so...done.
  
Loaded symbols for /home/admin/sap/lib/libcm_basic.so
  
Reading symbols from /home/admin/sap/lib/libarpc.so.1...Reading symbols from /home/admin/sap/lib/.debug/libarpc.so.1.0.0.debug...done.
  
... ...
  
#0  0x0000003959230265 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
  
64        return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);
  
(gdb) bt
  
#0  0x0000003959230265 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
  
#1  0x0000003959231d10 in abort () at abort.c:88
  
#2  0x000000395d6bec44 in __gnu_cxx::__verbose_terminate_handler () at ../../../../libstdc++-v3/libsupc++/vterminate.cc:97
  
#3  0x000000395d6bcdb6 in __cxxabiv1::__terminate (handler=<value optimized out>)
  
at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:43
  
#4  0x000000395d6bcde3 in std::terminate () at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:53
  
#5  0x000000395d6bd2ef in __cxa_pure_virtual () at ../../../../libstdc++-v3/libsupc++/pure.cc:55
  
#6  0x00002b8729bfc933 in arpc::ClientPacketHandler::handlePacket (this=0x2aac6df6ee38, packet=0x2aac6df6fc30,
  
args=<value optimized out>) at build/release64/arpc/ClientPacketHandler.cpp:35
  
#7  0x00002b872a0ddcd8 in anet::Connection::handlePacket () from /home/admin/sap/lib/libanet.so.3
  
#8  0x00002b872a0e75fb in anet::TCPConnection::readData () from /home/admin/sap/lib/libanet.so.3
  
#9  0x00002b872a0e624b in anet::TCPComponent::handleReadEvent () from /home/admin/sap/lib/libanet.so.3
  
#10 0x00002b872a0e8c0b in anet::Transport::eventIteration () from /home/admin/sap/lib/libanet.so.3
  
#11 0x00002b872a0e8cf2 in anet::Transport::eventLoop () from /home/admin/sap/lib/libanet.so.3
  
#12 0x00002b872a0e8d47 in anet::Transport::run () from /home/admin/sap/lib/libanet.so.3
  
#13 0x00002b872a0ea02d in anet::Thread::hook () from /home/admin/sap/lib/libanet.so.3
  
#14 0x0000003959e064a7 in start_thread (arg=<value optimized out>) at pthread_create.c:297
  
#15 0x00000039592d3c2d in clone () from /lib64/libc.so.6
  
Current language:  auto; currently c 

与符号表分离程序或动态库, 如何用GDB调试相关推荐

  1. Linux命令【三】gcc编译+静态库+动态库+makefile+gdb调试

    用C编译器编译源文件:gcc 源文件 -o 可执行文件名 详细步骤: gcc -E a.c -o a.i预处理器将头文件展开,宏替换,去掉注释 gcc -S a.i -o a.s编译器将C文件变成汇编 ...

  2. 查看linux下程序或者动态库到底依赖哪些so动态库以及对应的版本

    一. ldd命令 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 # ldd /bin/ls linux-vdso.so.1 => (0x00 ...

  3. linux 程序、动态库、静态库内部添加版本号和编译时间

    2019独角兽企业重金招聘Python工程师标准>>> 给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2 ...

  4. linux中查询动态库版本的命令,linux 程序、动态库、静态库内部添加版本号和编译时间详解...

    给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本.所以, ...

  5. alsa的动态库安装在哪里_linux 给运行程序指定动态库路径

    1. 连接和运行时库文件搜索路径到设置 库文件在连接(静态库和共享 库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/li ...

  6. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

  7. arm ida 伪代码 安卓 符号表_使用IDA动态调试及ARM指令学习笔记

    本文介绍如何用IDA进行动态调试及部分ARM指令的学习. 环境:已root的安卓手机一部,IDA pro 6.8,win7系统. 下载样本app,并已确认可调试(debuggable = true), ...

  8. Linux下如何用GDB调试c++程序 [版本2]

    文章转自:http://www.cnblogs.com/iyjhabc/p/3163649.html 版权归原作者. 使用gdb可以在命令行方便地调试,并且能以命令程序的方式调试源代码. 常用命令简写 ...

  9. PostgreSQL的学习心得和知识总结(二十四)|CentOS环境 配置生成coredump程序崩溃内存转储文件及gdb调试core文件

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.使用GDB分析core dump文件,点击前往 2.详解coredump,点击前往 3.PostgreSQL数据库仓库链 ...

最新文章

  1. 自学python要下载什么软件-想自学Python,如何才能坚持下来?
  2. java1002java,疯狂java学习笔记1002---抽象类及接口
  3. 深度学习工作开展_深入开展深度工作:新经济中的两项核心能力
  4. matlab字符串固定长度,限制Matlab用户界面编辑框中的字符串长度
  5. Java编程思想学习(一)----对象导论中多态的理解
  6. ZOJ2724_Windows Message Queue(STL/优先队列)
  7. 如何使用webrtc 一
  8. 20220227:力扣第282场周赛(上)
  9. (day 09 - 递归)剑指 Offer 28. 对称的二叉树
  10. Cgroup框架分析
  11. html图片白色背景怎么去掉,怎么把PPT图片的白色背景去掉 PPT去除图片背景颜色技巧...
  12. python+selenium+scrapy框架爬取斗鱼主播相册内的 图片
  13. OCR-文本检测和文本识别的数据
  14. 浪潮信息助力医院智慧医疗建设走得既稳又快
  15. GitHub代码托管
  16. 西门子S7-1200PLC和KTP700触摸屏通过USS协议控制MM420变频器
  17. 现在的千兆光猫都自带路由功能,是否就不需要路由器了?
  18. 虚拟内存太低怎么办?
  19. 联想乐檬k3刷安卓5.1教程
  20. 0124:镂空三角形(C++)

热门文章

  1. 学计算机专业准备什么电脑,大一新生有必要带电脑吗?辅导员说出答案,报道前需要了解清楚...
  2. [CSS] 自定义变量带你随心所欲,一键换肤
  3. 刘东戈教授|追本溯源—2B3D是CSCO推荐具有重要意义的MSI检测位点
  4. 有关羽毛球的英文术语
  5. Android 生命周期之构造器
  6. python输出偶数_python偶数怎么表达 python判断偶数奇数
  7. sun公司java编程规范【转载】
  8. Android编辑昵称、个性签名
  9. 《蝴蝶效应》DVD全攻略
  10. java基础学习5---包装类及常用方法