GDB调试动态库

2023-11-09

转载:https://blog.csdn.net/huluedeai/article/details/52225923

一:方法

gdb如何调试动态链接库的问题。比如我想调试的代码为动态链接库代码,我设置断点后却得到以下错误
(gdb) b mps_guide_db.c:1699
No source file named mps_guide_db.c.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]

可以通过 以下方式得到解决:
(gdb) set breakpoint pending on
(gdb) b db_subscr_no_lookup
Function "db_subscr_no_lookup" not defined.
Breakpoint 1 (db_subscr_no_lookup) pending.
(gdb) r mcap06 2
Starting program: /usr1/arbor/bin/MCAP mcap06 2
[Thread debugging using libthread_db enabled]
Traceback (most recent call last):
  File "/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.py", line 19, in <module>
    import os
ImportError: No module named os
[New Thread 0x7ffff1165700 (LWP 7449)]


Breakpoint 1, db_subscr_no_lookup (cat_connection=0x699520, cdr=0x623300, external_id=0x7fffffff9944 "yy_tc01", db_active_dt=0x7fffffff98b0, db_inactive_dt=0x7fffffff98a0, target_origin_flag=0, network_delay=0) at guide/mps_guide_db.c:1711
1711        if ( giUseHierarchyRt )
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.x86_64 libaio-0.3.107-10.el6.x86_64 libgcc-4.4.6-4.el6.x86_64 libstdc++-4.4.6-4.el6.x86_64 numactl-2.0.7-3.el6.x86_64
(gdb) list
1706        static char *mps_subscr_no_lookup_inline = "SELECT \
1707    server_id, account_no, subscr_no, subscr_no_resets, active_date, inactive_date \
1708    FROM EXTERNAL_ID_EQUIP_MAP \
1709    WHERE external_id = :v1 AND external_id_type = :v2 ORDER by active_date";
1710
1711        if ( giUseHierarchyRt )
1712        {
1713           switch( target_origin_flag )
1714           {
1715           case SL_ORIGIN:

(gdb) help set breakpoint pending 
Set debugger's behavior regarding pending breakpoints. 
If on, an unrecognized breakpoint location will cause gdb to create a 
pending breakpoint. If off, an unrecognized breakpoint location results in 
an error. If auto, an unrecognized breakpoint location results in a 
user-query to see if a pending breakpoint should be created.

http://blog.csdn.net/yasi_xi/article/details/18552871

在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上 -g 参数。我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。首先,假设我们准备这样的一个动态链接库:引用:库名称是: ggg 动态链接库文件名是: libggg.so 头文件是: get.h 提供这样两个函数调用接口:

   int get ();
   int set (int a);
要生成这样一个动态链接库,我们首先编写这样一个头文件:


/************关于本文档********************************************
*filename: get.h
*********************************************************************/
int get ();
int set (int a);
然后准备这样一个生成动态链接库的源文件:


/************关于本文档********************************************
*filename:  get.cpp
*********************************************************************/
#include <stdio.h>
#include "get.h"


static int x=0;
int get ()
{
        printf ("get x=%d\n", x);
        return x;
}


int set (int a)
{
        printf ("set a=%d\n", a);
        x = a;
        return x;
}
然后我们用 GNU 的 C/C++ 编译器来生成动态链接库,编译命令如下:


g++ get.cpp -shared -g -DDEBUG -o libggg.so
g++ get.cpp -shared -g -fPIC -DDEBUG -o libggg.so (64位机器)
这样我们就准备好了动态链接库了,下面我们编写一个应用程序来调用此动态链接库,源代码如下:


/************关于本文档********************************************
*filename: pk.cpp
*********************************************************************/
#include <stdio.h>
#include "get.h"
int main (int argc, char** argv)
{
        int a = 100;
        int b = get ();
        int c = set (a);
        int d = get ();


        printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);


        return 0;
}
编译此程序用下列命令,如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib 或 /usr/lib 之类的,就用下面这条命令:


g++ pk.cpp -o app -Wall -g -lggg
否则就用下面这条命令:


g++ pk.cpp -o app -Wall -g -lggg -L`pwd`
下面我们就开始调试上面命令生成的 app 程序吧。如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib 或 /usr/lib 之类的,调试就顺利完成,如下:


#gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".


(gdb) b main    /* 这是在程序的 main 处设置断点 */
Breakpoint 1 at 0x804853c: file pk.cpp, line 7.
(gdb) b set      /* 这是在程序的 set 处设置断点 */
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y /* 这里必须选择 y 调试程序才会跟踪到动态链接库内部去 */
Breakpoint 2 (set) pending.
(gdb) run /* 开始运行我们的程序,直到遇见断点时暂停 */
Starting program: /data/example/c/app
Breakpoint 3 at 0xb7f665f8: file get.cpp, line 11.
Pending breakpoint "set" resolved


Breakpoint 1, main (argc=1, argv=0xbf990504) at pk.cpp:7
7               int a = 100;
(gdb) n     /* 继续执行程序的下一行代码 */
8               int b = get ();
(gdb) n      /* 程序执行到了我们断点所在的动态链接库了 */
get x=0
9               int c = set (a);
(gdb) n


Breakpoint 3, set (a=100) at get.cpp:11
11              printf ("set a=%d\n", a);
(gdb) list   /* 查看当前代码行周围的代码,证明我们已经跟踪到动态链接库的源代码里面了 */
6               printf ("get x=%d\n", x);
7               return x;
8       }
9       int set (int a)
10      {
11              printf ("set a=%d\n", a);
12              x = a;
13              return x;
14      }
(gdb) n
set a=100
12              x = a;
(gdb) n
13              return x;
(gdb) n
14      }
(gdb) n
main (argc=1, argv=0xbf990504) at pk.cpp:10
10              int d = get ();
(gdb) n
get x=100
11              printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
(gdb) n
a=100,b=0,c=100,d=100
12              return 0;
(gdb) c
Continuing.


Program exited normally.
(gdb) quit  /* 程序顺利执行结束 */


如果我们没有把动态链接库放到指定目录,比如/lib里面,调试就会失败,过程如下:


# gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".


(gdb) b main
Breakpoint 1 at 0x804853c: file pk.cpp, line 7.
(gdb) b set
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (set) pending.
(gdb) run  /* 虽然调试操作都一样,但程序执行失败 */
Starting program: /data/example/c/app
/data/example/c/app: error while loading shared libraries: libggg.so: cannot open shared object file: No such file or directory


Program exited with code 0177.
(gdb) quit 
调试失败的原因是因为gdb不能找到libggg.so,可以通过下面的方法解决:


1) 将库路径加到LD_LIBRARY_PATH里
2) 执行:ldconfig YOUR_LIB_PATH
3) 在/etc/ld.so.conf里加入库所在路径。然后执行:ldconfig


上面3个方法任意一个都可以,然后再去用gdb调试就没有问题了。
另:


1、假设我的可执行程序是ServerName,共享库为worker.so
2、我用gdb调试ServerName,想在B的某个源文件(比如worker.cpp,worker.cpp与ServerName不在同一个目录下)中设置断点,使用下面的命令行break worker.cpp:123


若找不到源文件可使用如下命令设定源文件目录:


设定gdb环境变量 LD_PRELOAD,在执行程序前先把共享库代码load进来
指定你的链接库的位置,可以通过设定环境变量LD_LIBRARY_PATH来实现


拷贝到标准的lib搜寻目录下,例如/usr/lib等


b main, r,然后再设置断点就可以了,共享库只有当程序运行才开始加载的
linuxGDB下动态链接库的调试


gdb) file <你的exe>
(gdb) load <你的so>                #这条应该是可选的
(gdb) dir <so'dir>
(gdb) sharedlibrary <你的so>
(gdb) breakpoint <你的so中somewhere>
(gdb) run
load 是将动态库加载入内存。
sharedlibrary是将动态库的符号读入gdb,为了你能找到变量和函数名。
它们本身是没明显的动作,但后面当你直接设置断点到动态库的函数(或行号时,你就可以成功了。在此之前要记得用dir将动态库的源码也加入搜索路径。

二:方法

 

原文地址:

http://www.gonwan.com/?tag=gdb

在本例中使用了libcurl.so.4库

step1:

编译libcurl.so.4的可调试版本:

 

 
  1. # sudo apt-get source libcurl3-dbg

  2. # cd curl-7.19.7/

  3. # ./configure --prefix=/usr/local --enable-debug --enable-static=0

  4. # make

编译好的带调试信息的动态库放在了这个隐藏目录:

 

LD_LIBRARY_PATH=/home/gonwan/testgdb/curl-7.19.7/lib/.libs/ gdb ./testcurl


step2:编写调试程序并编译

 

 
  1. #include <curl/curl.h>

  2. int main() {

  3. curl_easy_init();

  4. return 0;

  5. }

</pre><pre name="code" class="html"><span style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 13px; line-height: 14.3000001907349px; white-space: pre;"> gcc -g testcurl.c -o testcurl /usr/lib/libcurl.so.4</span>


step3:启动gdb,调试上述代码

 

 

LD_LIBRARY_PATH=/home/gonwan/testgdb/curl-7.19.7/lib/.libs/ gdb ./testcurl

LD_LIBRARY_PATH的作用只制定加载动态库的位置,在这里指定了程序运行加载的动态库的位置

 

关于这个环境变量的详细解释,参见这里:

http://linuxmafia.com/faq/Admin/ld-lib-path.html

 

step4:调试程序:

  1. root@localhost:/home/smb/curl-7.26.0# LD_LIBRARY_PATH=/home/smb/curl-7.26.0/lib/.libs gdb ./testcurl

  2. GNU gdb (GDB) 7.4.1-debian

  3. Copyright (C) 2012 Free Software Foundation, Inc.

  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

  5. This is free software: you are free to change and redistribute it.

  6. There is NO WARRANTY, to the extent permitted by law. Type "show copying"

  7. and "show warranty" for details.

  8. This GDB was configured as "i486-linux-gnu".

  9. For bug reporting instructions, please see:

  10. <http://www.gnu.org/software/gdb/bugs/>...

  11. Reading symbols from /home/smb/curl-7.26.0/testcurl...done.

  12. (gdb) r

  13. Starting program: /home/smb/curl-7.26.0/testcurl

  14. [Thread debugging using libthread_db enabled]

  15. Using host libthread_db library "/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1".

  16. [Inferior 1 (process 30604) exited normally]

  17. (gdb) l

  18. 1 #include "./include/curl/curl.h"

  19. 2 int main() {

  20. 3 curl_easy_init();

  21. 4 return 0;

  22. 5 }

  23. (gdb) b 3

  24. Breakpoint 1 at 0x80485da: file testcurl.c, line 3.

  25. (gdb) c

  26. The program is not being run.

  27. (gdb) r

  28. Starting program: /home/smb/curl-7.26.0/testcurl

  29. [Thread debugging using libthread_db enabled]

  30. Using host libthread_db library "/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1".

  31.  
  32. Breakpoint 1, main () at testcurl.c:3

  33. 3 curl_easy_init();

  34. <strong>(<span style="color:#ff6666;">gdb) s

  35. curl_easy_init () at easy.c:351

  36. 351 if(!initialized) {</span></strong>

  37. (gdb)

  38. 352 res = curl_global_init(CURL_GLOBAL_DEFAULT);

  39. (gdb) q

  40. A debugging session is active.


可见已经进入了动态库进行调试了
 

总结:可见可以通过让应用程序加载带调试信息的动态库,进行动态库的调试

 

三:方法

转自:https://blog.csdn.net/zz7zz7zz/article/details/42238115

当自己开发了一个so文件,如何调试呢?

对于如何编写一个so,请参考文章:http://blog.csdn.net/zz7zz7zz/article/details/41448987

对于如何进行gdb调试,请参考文章:http://blog.csdn.net/zz7zz7zz/article/details/41654457

 

我们的源文件分别如下:

filea.c

 

 
  1. #include <stdio.h>

  2. void fun1()

  3. {

  4. printf("i am from filea fun1 \n");

  5. printf("i am from filea fun11 \n");

  6. printf("i am from filea fun12 \n");

  7. }

  8.  


fileb.c

 

 

 
  1. #include <stdio.h>

  2. void fun2()

  3. {

  4. printf("i am from fileb fun2 \n");

  5. printf("i am from fileb fun21 \n");

  6. printf("i am from fileb fun22 \n");

  7. }

  8.  


CLoadSo.h

 

 

 
  1. #ifndef _CLOADSO_H

  2. #define _CLOADSO_H

  3.  
  4. #ifdef _cplusplus

  5. extern "C" {

  6. #endif

  7.  
  8. void fun1();

  9. void fun2();

  10.  
  11. #ifdef _cplusplus

  12. }

  13. #endif

  14.  
  15.  
  16. #endif

  17.  

 

 

CLoadSo.c

 

 
  1. #include <stdio.h>

  2. #include <dlfcn.h>

  3. #include "CLoadSo.h"

  4.  
  5. int main(int argc,char **argv)

  6. {

  7.  
  8. void *soHandle;

  9. int (*fun)();

  10. char *errorMsg;

  11.  
  12. soHandle=dlopen("first.so",RTLD_LAZY);

  13. errorMsg=dlerror();

  14.  
  15.  
  16. printf("A1---------loadSo is %s \n",soHandle ? "success" : "failed");

  17. if(errorMsg)

  18. {

  19. printf("A2--------loadSo error , Msg is: %s \n",errorMsg);

  20. return -1;

  21. }

  22.  
  23. fun=dlsym(soHandle,"fun1");

  24. errorMsg=dlerror();

  25. printf("B1---------fun1 , fun1 is %s \n",fun ? "success" : "Null");

  26. if(fun)

  27. {

  28. fun();

  29. }

  30. if(errorMsg)

  31. {

  32. printf("B2---------fun1 error , Msg is: %s \n",errorMsg);

  33. }

  34.  
  35. fun=dlsym(soHandle,"fun2");

  36. errorMsg=dlerror();

  37. printf("B3---------fun2 , fun2 is %s \n",fun ? "success" : "Null");

  38. if(fun)

  39. {

  40. fun();

  41. }

  42. if(errorMsg)

  43. {

  44. printf("B4---------fun2 error , Msg is: %s \n",errorMsg);

  45. }

  46.  
  47. fun=dlsym(soHandle,"fun3");

  48. errorMsg=dlerror();

  49. printf("B5---------fun3 , fun3 is %s \n",fun ? "success": "Null");

  50. if(fun)

  51. {

  52. fun();

  53. }

  54. if(!errorMsg)

  55. {

  56. printf("B6---------fun3 error , Msg is: %s \n",errorMsg);

  57. }

  58.  
  59.  
  60. dlclose(soHandle);

  61. printf("C---------close LoadSo \n");

  62.  
  63. return 0;

  64. }

  65.  


用命令 gcc -Wall -fpic -g -shared filea.c fileb.c -o first.so 生成first.so文件

 

用命令 gcc -g -Wall CLoadSo.c -o CLoadSo -ldl生成可执行文件CLoadSo

 

gdb步骤如下(请注意观察注释语句):

 

 

结果:成功进入到了so的fun1中

大概步骤:

1.启动gdb调试:gdb CLoadSo

2.打断点 gdb) : break 28

3.执行 gdb) : run

4.将动态库的符号读入gdb,为了你能找到变量和函数名 gdb)sharedlibrary first.so

5.s进入函数,l列出源代码,n单步执行,直到结束.

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDB调试动态库 的相关文章

  • 终于有人把 Docker 讲清楚了,别再说不会 Docker 了!(摘)

    富 Web 时代 应用变得越来越强大 与此同时也越来越复杂 集群部署 隔离环境 灰度发布以及动态扩容缺一不可 而容器化则成为中间的必要桥梁 本文我们就来探索一下 Docker 的神秘世界 从零到一掌握 Docker 的基本原理与实践操作 别
  • APT攻击是什么?面对APT攻击,我们应该怎么做?

    目录 一 概念 二 APT攻击特征 三 APT攻击技术 3 1 APT攻击方式 3 2 APT攻击诱饵种类 四 APT攻击模式 4 1 第一阶段 扫描探测 4 2 第二阶段 工具投送 4 3 第三阶段 漏洞利用 4 4 第四阶段 木马植入
  • 区块链学习笔记13——ETH以太坊概述

    区块链学习笔记13 ETH以太坊概述 学习视频 北京大学肖臻老师 区块链技术与应用 笔记参考 北京大学肖臻老师 区块链技术与应用 公开课系列笔记 目录导航页 比特币和以太坊是两种最主要的加密货币 比特币被称为区块链1 0 以太坊被称为区块链
  • 自动驾驶开发入门(三)---浅谈Apollo Cyber RT中的Transport

    Cyber的Transport为上层封装了底层数据传输的细节 上层主要使用Transport Transmitter Receiver三个类 其中Transport是工厂类 负责创建Transmitter Receiver以及Dispatc
  • pyspark作为生产者发送消息(推送数据)到kafka

    pyspark作为生产者发送消息到kafka 网上大部分的案例都是pyspark作为消费者消费kafka的消息 但是作为生产者生产消息发送给kafka的很少 下面把pyspark如何创建数据 或读取数据 作为生产者发送消息给kafka作为案
  • C++字节对齐

    系统让程序中的变量按字节对齐的目的 访问高效 字节是内存空间分配的最小单位 在程序中 我们定义的变量可以放在任何位置 但实际情况是访问特定类型变量的时候在特定的内存地址访问 这就需要各种类型数据按照一定的规则在空间排列 而不是顺序的一个接着
  • 两台文件服务器,负载均衡,用两台云服务器搭建一个负载均衡

    用两台云服务器搭建一个负载均衡 内容精选 换一换 弹性负载均衡 Elastic Load Balance 以下简称ELB 通过将访问流量自动分发到多台弹性云服务器 扩展应用系统对外的服务能力 实现更高水平的应用程序容错性能 用户通过基于浏览
  • 顺序表的C语言实现(静态/动态)

    目录 1 顺序表的定义 2 顺序表的实现 静态分配 3 顺序表的实现 动态分配 1 顺序表的定义 线性表的顺序存储又称顺序表 它是用一组地址连续的存储单元依次存储线性表中的数据元素 使得逻辑上相邻的两个元素在物理位置上也相邻 因此 顺序表的
  • C++基础知识 - 浮点类型

    需要精确计算的数学 工程应用 用整数类型不合适 float类型 单精度浮点类型 用来存储带小数部分的数据 在内存中占用4个字节 表示范围 3 4 1038 3 4 1038 不需记忆 精度 最长7位有效数字 是指7位10进制位 精度只能取值
  • 【Android】常用对话框大全(二)Material Dialog

    前言 上一篇文章中 谈到本系列的文章将讲解Android dialog Material dialog 为何要谈论Material呢 开发过Flutter的开发者也许就会明白 Material Design框架Flutter也在用 而在其官
  • MATLAB---获取图像中的指定像素点的值(RGB图像)

    输入 clear all RGB imread 图片名 格式 r x1 y1 z1 指定像素点的横坐标 c x2 y2 z2 指定像素点的纵坐标 p impixel RGB r c 用impixel 函数来返回RGB图像的横纵坐标对应的像素
  • Java 使用枚举消除if else

    1 功能需求 if else判断时写代码过程中非常常见的 但是有些相对比较固定格式的if else判断却是我们可以尽可能避免的 其中 枚举的作用在我们消除if else代码快的作用非常大 那么 我们该如何实现呢 2 代码实现 定义枚举变量
  • 【54-Sentinel熔断、降级、限流的基本概念-Sentinel实战上手应用-actuator实时监控-Docker安装部署Sentinel教程-熔断降级实战练习-Sentinel自定义资源】

    一 知识回顾 0 三高商城系统的专题专栏都帮你整理好了 请点击这里 1 系统架构演进过程 2 微服务系统架构需求 3 高性能 高并发 高可用的三高商城系统项目介绍 4 Linux云服务器上安装Docker 5 Docker安装部署MySQL
  • Redis复习笔记

    Redis 是一个高性能的key value数据库 支持多种数据类型 String 可以是字符串 整数 浮点数 List 列表 一个链表 链表上的每个节点都包含一个字符串 Set 集合 包含字符串的无序收集器 并且被包含的每个字符串都是独一
  • Sharding-jdbc

    一 概念理解 垂直切分 包含垂直分库和垂直分表 1 1 垂直分库 专库专用 按照业务类型对表分类 1 2 垂直分表 基于数据表的列 字段 为依据切分的 是一种大表拆小表的模式 1 3 垂直切分优点 不同业务的数据进行独立维护 监控 扩展 在
  • 右键里没有新建txt文件选项 win7

    试试这个方法吧 win7的试过 成功 找个文本文档 复制一个 把里面的内容清空 改后缀为reg 点右键 编辑 把下面的内容复制进去 保存 然后双击导入注册表 Windows Registry Editor Version 5 00 HKEY
  • 建设一站式DevOps平台,腾讯云研发效能提升实践

    导语 近年来 研发效能提升越来越受到业界重视 许多厂商都在不断探索研发效能提升之路 从而实现研发效率和质量的持续优化 以应对日趋复杂的产品开发 那么腾讯云的研发效能相关工作是如何开展和落地的呢 今天我们特邀了腾讯云研发效能工作组负责人 腾讯
  • VirtualBox7.0

    文章目录 安装环境 记录目的 VirtualBox7 0安装及配置 VBox增强功能安装及共享文件夹配置 VBox增强功能安装 安装方法 共享文件夹建立 补充资料 更换系统源 anaconda安装 将bin路径加入系统path变量 增加源
  • FinClip 小程序原生页面要获取权限时该使用哪些接口?比uniapp更方便吗?

    概念 在小程序里面有一些权限需要小程序 微信 给予 比如用户手机号 运动步数 摄像头 通讯地址 iOS端 相机权限 二维码扫描接口 scanCode 选择图片接口 chooseImage 拍照 选择视频接口 chooseVideo 录像 C
  • xss绕过方法

    xss绕过方法 1 改变大小写 将大小写穿插编写 可以转换为 2 关闭标签 利用大于号 gt 关闭标签使得xss生效 gt 3 利用html标签触发事件 很多标签都可以对过滤进行绕过 格式 lt 标签 事件 执行语句 例如 p style

随机推荐

  • 汽车结构之仪表

    为了使驾驶员能够掌握汽车及各系统的工作情况 在汽车驾驶室内的仪表板上装有各种指示仪表 指示灯及各种报警信号装置 汽车上常用的仪表有车速里程表 发动机转速表 机油压力表 燃油表 冷却液温度 水温 表等 它们通常与各种信号灯一起安装在仪表板上
  • Fastjson出现$ref问题

    解决FastJson中 ref 循环引用检测 的问题的几种方式 一 现象 项目中用json形式来存储一个集合对象 用fastjson发现多了一些东西 ref 了解之后才发现是重复引用的问题 id 1 orderList id 2 date
  • gitlab配置与启动

    首先是初始化 命令 sudo gitlab ctl reconfigure 初始化后我们查看gitlab的启动状态 好了之后 我们只需去 etc gitlab gitlab rb文件中配置外部url及对应开放端口即可 如下 好的 配置完毕
  • 类加载学习

    一 类使用的7个阶段 类从被加载到虚拟机内存中开始 到卸载出内存 它的整个生命周期包括 加载 Loading 验证 Verification 准备 Preparation 解析 Resolution 初始化 Initiallization
  • Vue3.0 使用 axios访问本地 json文件并读取数据

    Vue3 0 vue cli4 5 访问本地 json文件并读取数据 使用 axios 首先要在对应的 vue cli4 5 项目下安装 axios 输入 npm install save axios 进行安装 npm install sa
  • 使用服务配置Config客户端获取不到yml文件下多级属性值Could not resolve placeholder ‘config.info‘ in value “${config.info}“

    使用服务配置Config客户端获取不到yml文件下多级属性值Could not resolve placeholder config info in value config info 问题 比如我这里想获取config下面的info信息
  • MySQL 索引底层为什么选择B+Tree

    MySQL 索引底层为什么选择B Tree
  • 16.5 C++智能指针-unique_ptr

    16 1 C 智能指针 new delete探秘 16 2 C 智能指针 shared ptr 16 3 C 智能指针 weak ptr 16 4 C 智能指针 shared ptr使用场景 陷阱 性能分析与使用建议 16 5 C 智能指针
  • 【网络安全】网络安全期末大题 复习题

    简答题 每小题10分 共10分 1 计算机操作系统还原的操作步骤一般有哪些 当电脑开机的时候 请尝试按下F8或f7 看电脑上显示F8还是F7 按方向下键选择 MaxDOS 备份 还原 维护系统 按方向下键选择 快速全自动备份还原系统 按 E
  • 永恒之蓝(MS17-010)

    目录 追溯了解 百度 网络IP查找 环境条件 复现流程 445端口 使用MSF的永恒之蓝漏洞模块 扫描模块 攻击模块 温馨提醒 纯水文 如果不幸翻到这篇文章 可以立刻关闭 先整理两个学习的链接 本文学习第一个 https blog csdn
  • 2023高教社杯数学建模思路 - 案例:ID3-决策树分类算法

    文章目录 0 赛题思路 1 算法介绍 2 FP树表示法 3 构建FP树 4 实现代码 建模资料 0 赛题思路 赛题出来以后第一时间在CSDN分享 https blog csdn net dc sinor type blog 1 算法介绍 F
  • 使用frp进行内网穿透

    frp概述 frp 是一个高性能的反向代理应用 可以帮助您轻松地进行内网穿透 对外网提供服务 支持 tcp http https 等协议类型 并且 web 服务支持根据域名进行路由转发 frp 采用 C S 模式 将服务端部署在具有公网 I
  • 科学数学工程工具MATLAB软件2023a中文版下载安装,MATLAB特色

    MATLAB软件是一款被广泛应用于科学计算和工程设计领域的软件 其独特的功能使其成为了许多行业专业人员的首选 下面将会介绍MATLAB软件的独特功能并举例说明其在实际应用中的作用 MATLAB信号处理功能 MATLAB获取 hairuank
  • 【资源共享】好用的视觉软件Adaptive Vision Studio

    TRITOP Professional 2018 TRITOPBasic2018 PONTOS Live 2018 GOM Scan 2018 GOM Inspect Professional 2018 ATOS Professional
  • 【语义分割】分层多尺度注意力 Hierarchical multi-scale attention for semantic segmentation

    文章目录 1 摘要 2 引言 3 本文相关方法 3 1 Multi scale context methods 3 2 Relational context methods 3 3 Multi scale inference 3 4 Aut
  • 显式内存管理

    程序员在处理现实生活中国的C C 程序的时候 常会遇到诸如程序运行时突然退出 或占用的内存越来越多 最后不得不定期重启的一些典型状况 这些问题的源头可以追溯到C C 中的显式堆内存管理上 通常情况下 这些症状都是由于程序没有正确处理堆内存的
  • tomcat 乱码问题

    测试环境 apache tomcat 6 0 48 操作系统 win7 中文 默认GBK编码 一 浏览器采用的字符集 测试jsp
  • docker容器监控系统

    文章目录 第1章监控软件介绍 1 1监控工具 第2章Cadvisor Influxdb Grafana 2 1Cadvisor InfluxDB Grafana介绍 2 1 1Cadvisor 数据采集 2 1 2InfluxDB 数据存储
  • F - Ginger的GIAO

    F Ginger的GIAO SDUT OnlineJudge include
  • GDB调试动态库

    转载 https blog csdn net huluedeai article details 52225923 一 方法 gdb如何调试动态链接库的问题 比如我想调试的代码为动态链接库代码 我设置断点后却得到以下错误 gdb b mps