GDB+GDBserver 远程调试

2023-11-03

本文转自 https://www.cnblogs.com/Dennis-mi/articles/5018745.html      如若侵权,会及时删除。

 

内容摘要 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。 就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。 而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。

 

gdb的简单使用

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能:      1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
     2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
     3、当程序被停住时,可以检查此时你的程序中所发生的事。
     4、动态的改变你程序的执行环境。从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。
一个调试示例
—————— 源程序:tst.c       1 #include <stdio.h>
      2
      3 int func(int n)
      4 {
      5          int sum=0,i;
      6          for(i=0; i<n; i++)
      7          {
      8                  sum+=i;
      9          }
     10          return sum;
     11 }
     12
     13
     14 main()
     15 {
     16          int i;
     17          long result = 0;
     18          for(i=1; i<=100; i++)
     19          {
     20                  result += i;
     21          }
     22
     23         printf("result[1-100] = %d \\n", result );
     24         printf("result[1-250] = %d \\n", func(250) );
     25 } 编译生成执行文件:(Linux下)
     hchen/test> cc -g tst.c -o tst 使用GDB调试: hchen/test> gdb tst   <---------- 启动GDB
GNU gdb 5.1.1
Copyright 2002 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 "i386-suse-linux"...
(gdb) l      <-------------------- l命令相当于list,从第一行开始例出原码。
1         #include <stdio.h>
2
3         int func(int n)
4         {
5                 int sum=0,i;
6                 for(i=0; i<n; i++)
7                 {
8                         sum+=i;
9                 }
10                return sum;
(gdb)        <-------------------- 直接回车表示,重复上一次命令
11        }
12
13
14        main()
15        {
16                int i;
17                long result = 0;
18                for(i=1; i<=100; i++)
19                {
20                        result += i;    
(gdb) break 16     <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func   <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break   <-------------------- 查看断点信息。
Num Type            Disp Enb Address     What
1    breakpoint      keep y    0x08048496 in main at tst.c:16
2    breakpoint      keep y    0x08048456 in func at tst.c:5
(gdb) r            <--------------------- 运行程序,run命令简写
Starting program: /home/hchen/test/tst Breakpoint 1, main () at tst.c:17     <---------- 在断点处停住。
17                long result = 0;
(gdb) n           <--------------------- 单条语句执行,next命令简写。
18                for(i=1; i<=100; i++)
(gdb) n
20                        result += i;
(gdb) n
18                for(i=1; i<=100; i++)
(gdb) n
20                        result += i;
(gdb) c           <--------------------- 继续运行程序,continue命令简写。
Continuing.
result[1-100] = 5050        <----------程序输出。 Breakpoint 2, func (n=250) at tst.c:5
5                 int sum=0,i;
(gdb) n
6                 for(i=1; i<=n; i++)
(gdb) p i         <--------------------- 打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8                         sum+=i;
(gdb) n
6                 for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                         sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                 for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt         <--------------------- 查看函数堆栈。
#0   func (n=250) at tst.c:5
#1   0x080484e4 in main () at tst.c:24
#2   0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish     <--------------------- 退出函数。
Run till exit from #0   func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24               printf("result[1-250] = %d \n", func(250) );
Value returned is $6 = 31375
(gdb) c      <--------------------- 继续运行。
Continuing.
result[1-250] = 31375     <----------程序输出。 Program exited with code 027. <--------程序退出,调试结束。
(gdb) q      <--------------------- 退出gdb
hchen/test>

gdb+gdbserver方式进行ARM程序调试

【摘要】:本文首先介绍了gdb+gdbserver相关的概念,然后介绍了其下载、编译、安装等过程;接着介绍了利用gdb+gdbserver调试应用程序的流程及实例等;最后分析了下gdb+gdbserver安装过程中的常见问题。

【关键词】:gdb,gdbserver,远程调试

目录

一、gdb+gdbserver总体介绍... 1

二、源代码下载... 1

三、配置编译及安装下载... 1

四、gdb+gdbserver nfs调试流程... 2

五、如何利用串口调试... 3

六、实战调试... 3

七、linux下安装gdbserver问题... 5

一、gdb+gdbserver总体介绍

远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。

就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。

而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。

二、源代码下载

嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。这样,应用程序在嵌入式目标系统上运行,而gdb调试在Host端,所以要采用远程调试(remote)的方法。进行GDB调试,目标系统必须包括gdbserver程序(在主机上正对硬件平台编译成功后下载到目标机上),宿主机也必须安装GDB 程序。一般Linux发行版中都有一个可以运行的GDB,但开发人员不能直接使用该发行版中的GDB来做远程调试,而要获取GDB的源代码包,针对arm 平台作一个简单配置,重新编译得到相应GDB。GDB的源代码包可以从

http://www.gnu.org/software/gdb/download/

http://ftp.gnu.org/gnu/gdb/   211.95.105.202:3128可以上去的,所有的版本都有啊

http: //ftp.cs.pu.edu.tw/linux/sourceware/gdb/releases/下载

ftp://ftp.gnu.org/gnu/gdb

外网的ftp我经常上不去,国内常见的开源社区的下载频道通常都有下载的http://download.chinaunix.net/download/0004000/3482.shtml,最新版本为gdb-6.5.tar.bz2。下载到某个目录,笔者下载到/opt/。但要注意,gdb的版本需要和croostool 相匹配。

三、配置编译及安装下载

下载完后,进入/opt/目录,配置编译步骤如下:

 

#tar jxvf gdb-6.5-tar-bz2

#cd gdb-6.5

#./configure --target=arm-linux --prefix=/usr/local/arm-gdb –v

(--target配置gdb的目标平台,--prefix配置安装路径,当然其他路径也可以, .跟下面配置一致即可,须在环境变量中声明,启动arm-linux-gdb需要,可更改/etc/profile或~/.bash_profile或~/.bashrc,添加export PATH=$PATH:/usr/local/arm-gdb/bin,这样可以找到路径)

#make

#make install

(生成arm-linux-gdb,并存入/usr/local/arm-gdb /bin/,查询确认下)

也可以启动arm-linux-gdb,若成功,则证明安装无误

进入gdb/gdbserver目录:

[root@dding gdbserver]# pwd

/opt/gdb-6.5/gdb/gdbserver

[root@dding gdbserver]# 必须在gdbserver目录下运行配置命令,此时才能用相对路径

#./configure --target=arm-linux --host=arm-linux

(--target=arm-linux表示目标平台,--host表示主机端运行的是arm-linux-gdb,不需要配置—prefix,因为gdbserver不在主机端安装运行)

#make CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc

(这一步要指定你自己的arm-linux-gcc的绝对位置,我试过相对的不行,提示make: arm-linux-gcc: Command not found,可好多人都用的相对路径,即直接赋值arm-linux-gcc,可采取make时传递参数,也可以直接修改gdbserver目录下的Makefile文件中的环境变量CC)

 

 

没有错误的话就在gdbserver目录下生成gdbserver可执行文件,注意此时要更改其属性,否则可能会出现无法访问的情况,chmod 777 gdbserver将其更改为任何人都可以读写执行;使用arm-linux-strip命令处理一下gdbserver,将多余的符号信息删除,可让elf文件更精简,通常在应用程序的最后发布时使用;然后把它烧写到flash的根文件系统分区的/usr/bin(在此目录下,系统可以自动找到应用程序,否则必须到gdbserver所在目录下运行之),或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。

四、gdb+gdbserver nfs调试流程

下面就可以用gdb+gdbserver调试我们开发板上的程序了。在目标板上运行 gdbserver,其实就是在宿主机的minicom下。我是在minicom下#mount 192.168.2.100:/ /tmp后做的(这里参数-o nolock可以不加,不加这一步执行得反而更快些),hello和gdbserver都是位于Linux根目录下,把主机根目录挂在到开发板的/tmp 目录下。

要进行gdb调试,首先要在目标系统上启动gdbserver服务。在gdbserver所在目录下输入命令:

(minicom下)

#cd /tmp

#./gdbserver 192.168.2.100:2345 hello

192.168.2.100为宿主机IP,在目标系统的2345端口(你也可以设其他可用的值,当然必须跟主机的gdb一致)开启了一个调试进程,hello为要调试的程序(必须-g加入调试信息)。

出现提示:

Process /tmp/hello created: pid=80

Listening on port 2345

(另一个终端下)

#cd /

#export PATH=$PATH:/usr/local/arm-gdb/bin

#arm-linux-gdb hello

最后一行显示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-linux”...,如果不一致说明arm-linux-gdb有问题

说明此gdb在X86的Host上运行,但是调试目标是ARM代码。

(gdb) target remote 192.168.2.223:2345

(192.168.2.223为开发板IP)

出现提示:

Remote debugging using 192.168.2.223:2345

[New thread 80]

[Switching to thread 80]

0x40002a90 in ??()

同时在minicom下提示:

Remote debugging from host 192.168.2.100

(gdb)

注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。结果输出是在Target Board端,用超级终端查看。连接成功,这时候就可以输入各种GDB命令如list、run、next、step、break等进行程序调试了。

以上针对通过nfs mount和tftp的方式,只能在主机上调试好后下载到开发板上运行,如果有错误要反复这个过程,繁琐不说,有些程序只能在开发板上调试。所以笔者采用了gdbserver的远程调试方式。希望对大家调试程序有用!

五、如何利用串口调试

如果你用串口1调试hello的话,你就要现在板子上运行命令:

gdbserver hello /dev/ttyS0 (详情可以参考gdbserver目录下的readme文件)

这时gdbserver就在等待gdb的应答信号了。

然后在pc机上运行命令:

xxx-linux-gdb hello

在xxx-linux-gdb里敲入入下命令:

set remotedevice /dev/ttyS0(这里设置串口1)

set remote baud 9600 (这里设置串口波特率)

set debug remote 1(可选)

target remote /dev/ttyS0

操作到这儿,gdb就应该和gdbserver联系上了。

六、实战调试

1.编辑文件

# vi gdbtest.c

1 #include <stdio.h>

2

3 int

4 func(int n){

5     int   sum=0, i;

6     for (i=0; i<n; i++){

7         sum += i;

8     }

9     return sum;

10 }

11

12 int

13 main(void)

14 {

15    int   i;

16    long result = 0;

17    for (i=0; i<=100; i++){

18        result += i;

19    }

20 

21    printf("result[1-100] = %d \n", result);

22    printf("resutl[1-225] = %d \n", func(255));

23

24    return 0;

25 }

arm-linux-gcc -g gdbtest.c -o gdbtest         // 交叉编译

2.下载文件到目标板: gdbtest和gdbserver

假设 host pc ip:192.168.1.45

     board   ip:192.168.1.180   

将文件拷贝到目标板上:

先将gdbtest和gdbserver两个文件拷贝到主机的/tftpboot目录下,此时系统主机和目标机都必须能够支持nfs

在目标板的Linux中运行:

#mount 192.168.1.108:/tftpboot /mnt/nfs

#cd /mnt/nfs

#ls

看是否有gdbtest和gdbserver两个文件。

3.运行调试

client board:

#./gdbserver 192.168.1.45:1234 gdbtest  // 目标板上运行gdbtest 监听端口1234

[root@AT91RM9200DK arm]$./gdbserver 192.168.0.12:2345 mainparacarm

./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open [root@AT91RM9200DK arm]$

host pc:

#cd /usr/local/arm-gdb/bin/ 以便能够运行arm-linux-gdb,但是无此必要,可在环境变量中设置此路径即可。

#copy gdbtest /usr/local/arm-gdb/bin/   // 将前面编译的文件gdbtest拷贝到此目录

#./arm-linux-gdb gdbtest

(gdb)target remote 192.168.1.180:1234   // 连接到开发板成功后就可以

进行调试

(gdb)list   or l

(gdb)break func

(gdb)break 22

(gdb)info br   

(gdb)continue   or c    // 这里不能用 run

(gdb)next   or n

(gdb)print or p    result 

(gdb) finish        // 跳出func函数

(gdb) next

(gdb) quit

建立连接后进行gdb远程调试和gdb本地调试方法相同

七、 linux下安装gdbserver问题

toolchain version:   gdb的版本可能和交叉编译器有很大的关系

gcc-3.3.2

glibc-2.2.5

binutils-2.15 此为croostool 3.3.2

安装步骤:
下载解压gdb-6.6
#cd gdb-6.6
#./configure --target=arm-linux --prefix=/usr/local/arm-gdb –v

#make & make install

OK,然后:

#export PATH=$PATH:/usr/local/arm-gdb

进入gdbserver目录:

#./configure --target=arm-linux --host=arm-linux

#make CC=/usr/local/armv5l/3.3.2/bin/armv5l-linux-gcc

出错:

/usr/local/armv5l/3.3.2/bin/armv5l-linux-gcc -c -Wall -g -O2 -I. -I. -I./../regformats -I./../../include -I../../bfd -I./../../bfd linux-arm-low.c

linux-arm-low.c:35:21: sys/reg.h: 没有那个文件或目录

make: *** [linux-arm-low.o] 错误 1

然后把/usr/include/sys/reg.h copy到/usr/local/armv5l-2.6.x/3.3.2/armv5l-linux/include/sys/reg.h,即将该文件拷贝到交叉编译器的include目录下,再make,显示错误:

/usr/local/armv5l/3.3.2/bin/armv5l-linux-gcc -c -Wall -g -O2 -I. -I. -I./../regformats -I./../../include -I../../bfd -I./../../bfd thread-db.c

thread-db.c: In function `thread_db_err_str':

thread-db.c:95: error: `TD_VERSION' undeclared (first use in this function)

thread-db.c:95: error: (Each undeclared identifier is reported only once

thread-db.c:95: error: for each function it appears in.)

thread-db.c: In function `thread_db_get_tls_address':

thread-db.c:336: warning: implicit declaration of function `td_thr_tls_get_addr'

thread-db.c:336: warning: cast to pointer from integer of different size

thread-db.c:340: warning: cast from pointer to integer of different size

make: *** [thread-db.o] 错误 1

本想继续fix error,但是感觉不太对,请问各位,是什么原因呢?

是不是CC的target写错了?应该是arm-linux还是armv5l-linux?

1.

make: *** [linux-arm-low.o] Error 1

[root@dding gdbserver]#

[root@dding gdbserver]# gedit config.h

/* Define to 1 if you have the <sys/reg.h> header file. */

/*define HAVE_SYS_REG_H 1  */

/*have no  <sys/reg.h> header file. so undefine 20070402 dding  */

2.

thread-db.c: In function `thread_db_err_str': gdb6.5

thread-db.c:95: `TD_VERSION' undeclared (first use in this function)

[root@dding gdbserver]# gedit config.h

     94 #ifdef HAVE_TD_VERSION

     95     case TD_VERSION:

     96       return "version mismatch between libthread_db and libpthread";

     97 #endif

/* Define if TD_VERSION is available. */

/*#define HAVE_TD_VERSION 1  */

/*have no  TD_VERSION. so undefine 20070402 dding  */

gdb6.1 没有此问题

3.

[root@AT91RM9200DK arm]$./gdbserver 192.168.0.12:2345 mainparacarm  gdb6.5

./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open

[root@AT91RM9200DK arm]$./gdbserver 192.168.0.14:2345 mainparacarm  gdb6.1

./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open shared object file: No such file or directory

我已经加了libthread_db.so.1共享库为什么还打不开呢????共享库和cpu类型有关吗? 
gdbserver: error while loading shared libraries: libthread_db.so.1: cannot open 
shared object file: No such file or director

****编译GDB的时候搞成静态的就好了.我想编译选项里应该有. 要不你就在Makefile里加上CFLAGS += -static
LDFLAGS += -static
这两个的其中一个应该就可以了,不过还是两个都加上吧.

***/lib there is no  libthread_db.so.1 Can i use nfs to copy  libthread_db.so.1 to /lib? But now i cannot find this file, and is there any for cross 3.3.2?

libpthread-0.8.so

libpthread.so          libpthread.so.0        libresolv-2.1.3.so

libresolv.so.2         libstdc++.a.2.10.0     libtermcap.so.2

[root@AT91RM9200DK arm]$cp libthread_db-1.0.so libthread_db.so.1

[root@AT91RM9200DK arm]$cp libthread_db.so.1 /lib/

[root@AT91RM9200DK arm]$./gdbserver 192.168.0.12:2345 mainparacarm

./gdbserver: /lib/libc.so.6: version `GLIBC_2.2' not found (required by /lib/li)

难道目前的gdb 6.5 版本太高,需要内核版本和交叉编译器与之匹配?实在不行,就试试低版本的gdb

参考文档

http://blog.chinaunix.net/u/27802/showart_211833.html

http://litttlebylittle.bokee.com/5803108.html

http://www.blogcn.com/u/93/99/litcatfish/index.html

 

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

GDB+GDBserver 远程调试 的相关文章

  • 一分钟带你快速认识S参数

    S 参数是SI与RF领域工程师必备的基础知识 大家很容易从网络或书本上找到S Y Z参数的说明 但即使如此 在相关领域打滚多年的人 仍然可能还是会被一些问题困扰着 你懂S参数吗 不懂的话 那么请继续往下看 S参数简介 S参数 也就是散射参数
  • 雪崩击穿/齐纳击穿

    雪崩击穿 发生在掺杂浓度较低 自由电子冲撞价离子 温度越高 雪崩击穿需要的击穿电压越高 齐纳击穿 发生在掺杂浓度比较高的时候 自由电子直接跳出共价键 温度越高 齐纳击穿需要的击穿电压越低
  • 夜莺监控V6初探

    目标 客户用产品可能是功能设计好 也可能是因为响应快稳定可靠 例如滴滴用不了用高德 券商app故障受罚 微信凌晨服务崩溃 所以稳定性建设工作价值是保障客户体验 避免资损 社会负面舆论 故障生命周期处理 围绕故障生命周期 在整个故障定位体系
  • 手机内部充电电流控制原理图(如果手机支持快充,比如支持9V快充,则通过充电接口的D+、D-二根线,输出对应的高低电平组合,FP6601就会控制它的3脚接地,4脚悬空,此时R3与R2并联,改变反馈下拉)

    手机内部充电电流控制原理图 来源 电工之家 作者 电工之家 2019 12 08 10 48 7365次阅读 0 手机充电器电流控制方面 现在的手机充电器 无一例外 都使用了隔离式开关电源电路 充电器的体积 是最好的证明 对于隔离式开关电源
  • 电荷泵

    电荷泵 又称为电容式的开关稳压器 或开关电容DC DC变换器 无感式DC DC变换器 电荷泵采用电容作为开关和储能的元件 如图所示 S1与S3闭合 S2与S4断开 则Vin给电容充电 而后S1与S3断开 S2与S4闭合 则电容放电 此时Vo
  • 磁环相关的计算公式

    磁环相关的计算公式 公式来源 收集于各大网站 公式仅供参考 如有错误或不全的 欢迎留言指出 通过查磁环手册或咨询供应商可知的固有量 磁环外径 D 单位mm 磁环内径 d 单位mm 磁环高度 h 单位mm 磁环芯材磁导率 u 可推导的量 导磁
  • 60 KVM Skylark虚拟机混部-安装和配置

    文章目录 60 KVM Skylark虚拟机混部 安装和配置 60 1 安装Skylark 60 1 1 硬件要求 60 1 2 软件要求 60 1 3 安装方法 60 2 配置Skylark 60 2 1 日志 60 2 2 功耗干扰控制
  • PCB阻焊层太近了会不会有问题?

    绘制pcb双层板 进行DCR检查 发现如下报错 于是回到pcb的界面去查看 原来是我的组焊层靠的很近 小于规则的6mil 这个报错有必要修改嘛 规则的设置如下 最小组焊层裂口是6mil 但是封装就是官网上下载下来的 是芯片封装引脚的问题 过
  • Protues 8.7:i8086.DLL failed to create DSIM model

    如图所示 8086报错 解决一 换版本 如Protues 7 8 解决二 有的版本i8086 DLL文件不好用 使用这个 链接 https pan baidu com s 1eKniBmf7xJJHwPAxX8dQBg 提取码 8086 文
  • 树莓派raspberry pi 4 SSH默认密码无法登录解决办法

    以前玩过一段时间树莓派 只要开通ssh就可以 默认用户pi 默认密码 raspberry 远程连接就可以 但今天再玩却死活无法登录 如下 出了什么幺蛾子哦 上网一查 才知道pi账号在最近的raspberry pi os中因为安全原因已经删除
  • 57 KVM工具使用指南-制作 LibcarePlus 热补丁

    文章目录 57 KVM工具使用指南 制作 LibcarePlus 热补丁 57 1 概述 57 2 手动制作 57 3 通过脚本制作 57 KVM工具使用指南 制作 LibcarePlus 热补丁 57 1 概述 LibcarePlus 支
  • 华为星闪联盟:引领无线通信技术创新的先锋

    星闪 NearLink 是由华为倡导并发起的新一代无线短距通信技术 它从零到一全新设计 是为了满足万物互联时代个性化 多样化的极致 创新体验需求而诞生的 这项技术汇聚了中国300多家头部企业和机构的集体智慧 华为更是其中的主要贡献方 在过去
  • Tomcat开启远程调试端口

    部署环境 Linux 亲测成功 tomcat7 bin startup sh的文件开头位置添加 declare x CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunj
  • Matlab 编辑器框与命令行框视图分开两个窗口

    之前不知道怎么弄的 将matlab编辑器视图和命令行视图变成了两个窗口 效果如下图 这样调试代码我很不适应 点了好久才发现这叫停靠 点击编辑器窗口右上角 选择停靠 就能将编辑器窗口与命令行窗口在同一界面上
  • Python开发环境Wing IDE如何查看调试数据

    Wing IDE具有一个十分有用的特性 就是处理复杂bug的时候可以以各种各样的方式查看调试数据值 这个功能具体是由Watch工具实现的 查看数据值 在PrintAsHTML中发生异常时 右键单击Stack Data工具中的本地数值 这将显
  • 【BS】compilation debug=true targetFramework=4.0 无法识别的属性“targetFramework”

    一 背景 今天在发布网站的时候遇到这个问题 compilation debug true targetFramework 4 0 无法识别的属性 targetFramework 系统是师哥新做的windows server 2008 图一
  • DDR布线要求及拓扑结构分析

    在DDR的PCB设计中 一般需要考虑等长和拓扑结构 等长比较好处理 给出一定的等长精度通常是PCB设计师是能够完成的 但对于不同的速率的DDR 选择合适的拓扑结构非常关键 在DDR布线中经常使用的T型拓扑结构和菊花链拓扑结构 下面主要介绍这
  • [keil5] 中有关“TOOLS.INI-Section ‘[C51]‘ : missing ‘PATH‘ enty “错误

    在安装vdmagdi后 打开keil5 uVision5出现 gt gt gt TOOLS INI Section C51 missing PATH enty lt lt lt 错误 原因如下 双击运行vdmagdi exe文件 选择了AG
  • 2022年 大学生工程训练比赛[物料搬运]

    本人和团结参加了2022年大学生工程训练 简称工训赛 校赛选拔 准备了几个月的时间和花费了较多的资金 由于疫情等多种情况 很遗憾未能参加湖南省省赛 过了这么久还是写个博客记录参赛准备和调试过程 目录 一 比赛要求 二 整体思路 三 硬件模块
  • 从OpenInfra看开源软件的可持续、高质量发展

    近些年 云计算加快普及应用 作为催化剂和引擎之一 开源思想和开源软件功不可没 比如 国内很多大型头部企业当初就采用了开放开源的OpenStack作为其云的底座 时过境迁 随着人们对于云计算的认知和应用越来越成熟 OpenStack的使用方式

随机推荐

  • 飞桨学习笔记之图像分割套件PaddleSeg

    1 概述 2 基本原理 2 1 DeepLabv3 2 2 U Net 2 3 PSPNet 2 4 ICNet 2 5 HRNet 2 6 Fast SCNN 2 7 模型选择 2 8 模型评估 3 具体实现过程 3 1 准备数据集 3
  • 使用指纹的锁屏解锁流程

    startuml gt BiometricUnlockController onBiometricAuthenticated BiometricUnlockController gt BiometricUnlockController st
  • STM32在线升级OTA,看这一篇就够啦~

    本文是博主在学习OTA时 up主阿正推荐学习的文章 原作者leafguo 写的非常简洁明了 在获得授权后整理发布 可以在文末点击阅读原文跳转到原文章 简介 本文主要讲解在线升级 OTA 的基础知识 主要是针对IAP OTA从原理分析 分区划
  • DVWA靶机,通过XSS盗取cookie登录

    文章目录 一 发现XSS漏洞 1 1 登录DVWA 找到XSS DOM 模块 测试XSS是否存在 1 2 在选项的传参后面加入一串js代码 也就是可以XSS弹出的代码 payload如下 二 盗取cookie 2 1 在XSS平台上搭建一个
  • Linux 学习视频完整

    链接 https pan baidu com s 1O6zsaYo7kl28QTpOnr9wCA 提取码 e7u4
  • docker部署harbor

    一 harbor下载 官方下载地址 Releases goharbor harbor GitHub 二 harbor安装 1 解压安装包 tar xzvf harbor XXXX tgz 2 配置修改 复制harbor yml tmpl文件
  • quagga源码学习--BGP协议中的routemap

    路由策略的基础知识 定义 路由策略 Routing Policy 作用于路由 主要实现了路由过滤和路由属性设置等功能 它通过改变路由属性 包括可达性 来改变网络流量所经过的路径 目的 路由器在发布 接收和引入路由信息时 根据实际组网需要实施
  • uniapp 多选框的全选功能实现

    uniapp内置的checkbox其实以及checkbox group本来挺好的 但是有两个问题 无法依赖其事件实现全选 样式固定 难以修改 他们无法实现全选的原因是 我动态修改checkbox的checked字段时 界面上的状态能够实时变
  • Spring Cloud框架学习-Spring Cloud Stream

    文章目录 1 基本介绍 2 设计思想 3 常用注解 4 简单入门 5 自定义消息通道 6 消息分组 处理消息重复消费 7 消息分区 7 1 概念 7 2 使用示例 8 延时消息 8 1 安装插件 8 2 具体实现 1 基本介绍 Spring
  • python中sys.setdefaultencoding('utf-8')的作用

    在python中 编码解码其实是不同编码系统间的转换 默认情况下 转换目标是Unicode 即编码unicode str 解码str unicode 其中str指的是字节流 而str decode是将字节流str按给定的解码方式解码 并转换
  • 操作系统的进程管理

    进程组成 PCB PCB 系统为每个运行的程序配置一个数据结构 称为进程控制块 PCB 用来描述进程的各种信息 如程序代码存放位置 PCB 程序段 数据段三部分构成了进程实体 进程映像 所谓创建进程 实际上是创建进程实体中的PCB 撤销进程
  • Qt5中创建及使用自定义插件遇到的一些问题

    关键词 Qt5 IconEditor custom plugin QtCreator Failed Plugins 自定义插件 今天 C GUI Programming with Qt 4 看到了第五章自定义IconEditorPlugin
  • Mac M1芯片安装tensorflow和pytorch和spaCy

    mac m1 chip因为建构问题 直接pip的版本根本不兼容且不能用 安装踩了很多坑 在此记录一下 apple官网指南 以下是装tensorflow详细的介绍 安装Xcode 你在Apple store可以找到 装完打开一下 有一些东西只
  • TCP、UDP、IP 协议分析

    互连网早期的时候 主机间的互连使用的是NCP协议 这种协议本身有很多缺陷 如 不能互连不同的主机 不能互连不同的操作系统 没有纠错功能 为了改善这种缺点 大牛弄出了TCP IP协议 现在几乎所有的操作系统都实现了TCP IP协议栈 TCP
  • 软件测试项目经验案例,项目经验又多了一些

    目录 一 引言 二 测试任务 三 测试进度 四 测试资源 五 测试策略 六 测试完成标准 七 风险和约束 八 问题严重程度描述和响应时间规范 九 测试的主要角色和职责 有需要实战项目的评论区留言吧 软件测试是使用人工或者自动的手段来运行或者
  • 蓝桥杯历年省赛真题汇总及题目详解

    蓝桥杯历年决赛试题汇总及试题详解 2013年第四届蓝桥杯省赛真题详解 第四届蓝桥杯JavaA组题目解析 第四届蓝桥杯JavaB组题目解析 第四届蓝桥杯JavaC组题目解析 2014年第五届蓝桥杯省赛真题详解 第五届蓝桥杯JavaA组题目解析
  • 电子信息工程电子信息毕设分享100例(五)

    单片机毕业设计项目分享系列 这里是DD学长 单片机毕业设计及享100例系列的第一篇 目的是分享高质量的毕设作品给大家 包含全面内容 源码 原理图 PCB 实物演示 论文 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的单片机项目缺少
  • Ubuntu安装Pytorch(详细)

    最近发现了一个挺厉害的人工智能学习网站 内容通俗易懂 风趣幽默 感兴趣的可以点击此链接进行查看 床长人工智能教程 废话不多说 请看正文 一 安装NVIDIA GPU显卡驱动 1 准备工作 1 禁用BIOS中的secure boot 因为此方
  • 计算机组成与系统结构指导,计算机组成与系统结构实验指导书

    计算机组成与系统结构实验指导书 37页 本资源提供全文预览 点击全文预览即可全文预览 如果喜欢文档就下载吧 查找使用更方便哦 19 9 积分 计算机组成与系统结构 实验指导书内蒙古工业人子信息工程学院计算机系2005年10月第一部分实验系统
  • GDB+GDBserver 远程调试

    本文转自 https www cnblogs com Dennis mi articles 5018745 html 如若侵权 会及时删除 内容摘要 远程调试环境由宿主机GDB和目标机调试stub共同构成 两者通过串口或TCP连接 使用 G