Linux-gdb-段错误调试

 

Gdb 是一个超级强大的工具,经常在 Linux 平台的内核开发与应用程序开发当中看到它的身影。由于它的命令集极其庞大,本文就不针对具体的命令进行介绍,而是根据具体的问题场景进行一次使用总结,我最常用来调试的是段错误一类的场景,这里就取一个例子进行总结。

段错误类属于泛指,其实包括 SIGBUS、SIGSEGV 等类型的错误,或者是程序运行到某一段之后出现崩溃导致程序退出的问题。通常情况下使用一些 log 工具集成到代码里面也可以查出段错误类发生时刻的函数调用栈,但是大多数情况下不够灵活,比如要实时进行单步调试、查看调用栈里面的函数参数、查看段错误发生的那一刻所处函数的符号变量的值、查看指定寄存器的值、查看指定地址的值等等。

程序示例

一段简单的可以导致段错误的代码如下所示:

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

1 #include <stdio.h>

2

3 struct ring_king {

4 int iIdx;

5 char *skill;

6 char name[60];

7 struct ring_king *next;

8 };

9

10 void print_info(struct ring_king *king)

11 {

12 int i = 0;

13 struct ring_king *local_king;

14

15 for (local_king = king; local_king != NULL; local_king = local_king->next) {

16 local_king->skill[0] = 'e';

17 printf("skill[%s],name[%s].\n", local_king->skill, local_king->name);

18 i++;

19 }

20 printf("got [%d] kings.\n", i);

21 }

22

23 char skills_fly[6] = "fly";

24 char skills_eat[6] = "eat";

25 char skills_sleep[6] = "sleep";

26

27 struct ring_king global_kings[] = {

28 {0, &skills_fly[0], "K1", NULL},

29 {1, NULL, "K2", NULL},

30 {2, &skills_sleep[0], {0}, NULL},

31 };

32

33 int main(int argc, char *argv[])

34 {

35 int i = 0;

36 for (i = 1; i < sizeof(global_kings)/sizeof(struct ring_king); i++) {

37 global_kings[i-1].next = &global_kings[i];

38 }

39

40 print_info(&global_kings[0]);

41

42 return 0;

43 }

44

 

运行过程中当然会出现段错误,位置在上面代码的第 16 行,但是没有任何嵌入的 log 系统的话,报错提示只会有一个段错误的提示,并告诉你核心转储(core dump),提示内容类似下面:

1

2

3

yellow@ubuntu:~/workstation/apps/debugs$ ./seg-fault

skill[ely],name[K1].

Segmentation fault (core dumped)

 

如果内核没有开启 core dump 功能的话这段报错就会到此为止,没有任何多余的提示,这样及不利于程序额调试,如果是上面示例程序的错误类型还是比较容易查找的,但是一旦程序的规模大起来,不说代码量的事情,就光是因为多线程同步之类的问题导致的段错误,或者是运行过程中由硬件引入错误值导致的段错误是非常难以查找的,这个时候就有必要求助于 gdb 调试工具了。

使用 gdb 调试工具之前需要先洗手,然后在程序编译生成可执行文件的时候加上 -g 选项,这样才能够生成 gdb 可以识别的调试信息。我在本地的 ubuntu 虚拟机做实验的时候发现有以下几个问题:

  1. 如果在从 C 源文件生成目标文件的时候没有加上 -g 选项,那么即使链接的时候加上 -g 选项最终也不会生成完整的 gdb 可识别的调试信息,只是部分调试信息。调试信息的打入是在编译阶段产生的。
  2. -g 与 -Os、-O2 等选项同时存在的时候 -g 会被后者覆盖掉,-Os 是专门针对可执行程序大小进行优化的,-O2 只是优化级别为2,在使用 -g 的时候最好屏蔽后面两个选项以保留最完整的调试信息。
  3. 不同版本的 gcc 与 gdb 混用也会导致虽然加了 -g 选项,但是在栈回溯的时候仍然看不到函数内部的变量信息,这是因为 gcc 的 dwarf 版本与 gdb 的不匹配。本实验最开始使用 gdb-7.4 和 gcc-4.8 就出现了这种情况。在编译的时候使用 gcc -gdwarf-2 -g 才成功生成 gdb 可以识别的调试信息。
  4. 使用 -s 选项编译或者使用 strip 进行程序瘦身的时候 gdb 是看不到任何调试信息的。要注意该 -s 选项也会覆盖 -g 选项的。
  5. 带有链接库的,如果程序死在链接库里面,并且链接库有以上四种情况的任何一种,都会导致在断点那里看不到完整的 gdb 调试信息。

以上几个方面在 gdb 调试之前的准备工作时要额外注意,尤其是第四个,因为在嵌入式设备当中通常会为了节省存储空间而把程序的调试信息全部去掉(这个节省的空间是非常可观的),这个时候在线测试出来是无法看到完整的调试信息的,通常情况下会在送测之前保留一个没有经过 strip 或者其它体积优化措施的可执行文件,在出现错误的时候按照复现步骤再去用保留完整调试信息的程序去调试。或者是直接拿到 core dump 文件进行调试。

调试

在上面的工作全部准备好之后就可以开始正式的调试工作了,使用 gdb ./seg-fault 命令运行程序,如果需要参数的话有两种方法可以指定参数:

  1. gdb --args ./seg-fault args
  2. gdb ./seg-fault,然后在进入 gdb 命令行之后执行 set args arg

进入程序之后执行 r 命令运行程序,我这里的程序执行到段错误的时候会停下来,提示如下面所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

yellow@ubuntu:~/workstation/apps/debugs$ gdb ./seg-fault

GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04

Copyright (C) 2012 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 "i686-linux-gnu".

For bug reporting instructions, please see:

<http://bugs.launchpad.net/gdb-linaro/>...

Reading symbols from /home/yellow/workstation/apps/debugs/seg-fault...done.

(gdb) r

Starting program: /home/yellow/workstation/apps/debugs/seg-fault

skill[ely],name[K1].

Program received signal SIGSEGV, Segmentation fault.

0x08048427 in print_info (king=0x804a0c0) at ./seg-fault.c:16

16 local_king->skill[0] = 'e';

 

这里可以非常清晰的看到出错的地方是在 ./seg-fault.c 文件的第 16 行,并且连 C 代码都给打出来了,这种属于非常简单的例子,所以提示信息也是一目了然,我们很自然就可以想到是因为 local_king 或者是 local_king->skill 两个变量中的一个地址给错了,不一定是 NULL,只要是处于非法地址中的任何一个地址都有可能,比如数组越界访问都是有可能的,这里我在再深入探究一下。

然后在这里再次执行命令 bt,该命令会把函数调用栈打出来,范围是从出错的函数处到 main 函数中的第一层入口调用者,我的程序打印出来就是下面的样子:

1

2

3

(gdb) bt

#0 0x08048427 in print_info (king=0x804a0c0) at ./seg-fault.c:16

#1 0x080484d8 in main (argc=1, argv=0xbffff294) at ./seg-fault.c:40

 

可以看到它连函数的地址、函数的参数、调用的位置以及段错误的位置全部都给打出来了,顺序是从里到外,先打印最近一次的函数调用,然后依次回溯。这里先进去第 #0 个函数调用栈内部看一下。使用命令 f 0,后面接的 0 就是栈回溯的函数调用栈编号,f 0 就是进入第 0 个函数调用栈内部,此时 gdb 的调试上下文就会切换到这里:

1

2

3

4

5

6

7

8

(gdb) f 0

#0 0x08048427 in print_info (king=0x804a0c0) at ./seg-fault.c:16

16 local_king->skill[0] = 'e';

(gdb) info args

king = 0x804a0c0

(gdb) info local

i = 1

local_king = 0x804a108

 

使用 info args 查看函数调用的时候传入的参数的值,使用 info local 查看函数内部的变量的值,这个时候好像并没有看出来太离谱的异常,两个有可能出错的变量值之一 local_king 的值也不是 NULL 或者 0xFFFFFFFF 之类的一眼就可以看出异常的值,那就进一步看下另一个参数的值好了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

(gdb) p local_king

$5 = (struct ring_king *) 0x804a108

(gdb) p *local_king

$1 = {iIdx = 1, skill = 0x0, name = "K2", '\000' <repeats 57 times>, next = 0x804a150}

(gdb) set print pretty on

(gdb) p *local_king

$2 = {

iIdx = 1,

skill = 0x0,

name = "K2", '\000' <repeats 57 times>,

next = 0x804a150

}

(gdb) p &i

$3 = (int *) 0xbffff1a8

(gdb) p i

$4 = 1

 

如上面所示,最终打出来 local_king 的成员的值(set print pretty on 只是为了更好看的输出打印信息),发现 skill 成员的值是 0x0,如果不看代码的话,有可能 skill 是一个 int 类型之类的值,好像也不能说明什么,此时有三种方法可以找到问题:

  1. 直接看代码,因为源代码有,并且也打出来了出错的位置,直接看就完了。
  2. 使用 l 命令列出当前所处位置的代码,我执行之后就可以直接看到 skill 的使用方式是下标取值的形式,对一个地址 0 再去取下标肯定是错的,因为程序内存分布中地址 0 不应该存放数据段。
  3. 直接在 gdb 里面查看 skill 的类型,使用 ptype 命令:

    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

    (gdb) ptype local_king

    type = struct ring_king {

    int iIdx;

    char *skill;

    char name[60];

    struct ring_king *next;

    } *

    (gdb) x/10d local_king

    0x804a108 <global_kings+72>: 1 0 12875 0

    0x804a118 <global_kings+88>: 0 0 0 0

    0x804a128 <global_kings+104>: 0 0

    (gdb) x/10s local_king

    0x804a108 <global_kings+72>: "\001"

    0x804a10a <global_kings+74>: ""

    0x804a10b <global_kings+75>: ""

    0x804a10c <global_kings+76>: ""

    0x804a10d <global_kings+77>: ""

    0x804a10e <global_kings+78>: ""

    0x804a10f <global_kings+79>: ""

    0x804a110 <global_kings+80>: "K2"

    0x804a113 <global_kings+83>: ""

    0x804a114 <global_kings+84>: ""

    (gdb) x/10x local_king

    0x804a108 <global_kings+72>: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00

    0x804a110 <global_kings+80>: 0x4b 0x32

可以看到 local_king 内部的成员的类型,很容易知道 skill 是一个指针类型的变量,这个时候就可以基本断定出错的原因了。x/NumType Addr 这个命令是用于查看内存的,上面演示了三种查看的方式,可以看到内存里面的值的内容,如果是字符串类型就可以使用 x/100s Addr 这样的形式去查看里面的内容,这个主要是用于查看某段地址里面的内容是否是非法的。

再次基础上我们还可以根据栈回溯来一层层往上去查看参数传递在哪一层出现了错误赋值,虽然这个过程比较艰难,但是目前我还没有找到一个比较好的办法去断定参数值变态恶化的具体位置。

核心转储

也可以使用 core dump 文件来暂时转储段错误时生成的信息,然后再使用 gdb 进行调试。在 PC 机上面需要进行一些操作:ulimit -c unlimited。执行该命令之后执行程序出现段错误等可使程序终止的错误时会生成一个 core 文件,里面保存了出错时的调试信息,这个时候直接执行:gdb core_file ./seg-fault 即可进入犯罪现场。接下来的操作就是跟上面的一样了。

为什么要使用核心转储?因为通常情况下测试与开发总是分隔两地,可望不可即,测试也不总是直接带着 gdb 去跑程序,并且某些错误可能会比较难以复现,当测试很轻松的复现之后,拿到开发人员这边使用同样的操作步骤却是死活都整不出来这个错误。这个时候保留犯罪现象就是非常有必要的了,省去了开发这边的辛苦复现工作,直接拿过来用即可。

在嵌入式设备上操作方式与 ubuntu 发行版有所不同,需要自行定制 core dump 功能,在内核选项里面选中该功能并打开它即可使用。通常情况下还可以自行修改核心转储的代码进行一些定制化的调试信息保存或者打印,这个不在本文的讨论范围。

其它类型段错误

造成段错误的原因不止有 NULL 这一种类型,也有可能是内存的越界访问,内存越界问题通常会导致某些值非常奇怪,比如一个数组下标变量可能会变成负值,或者是非常大的一个值,比如说一个亿,这个时候就需要注意它是怎么来的了。

非法的值范围,不仅包括数组下标一种,还有可能是其它的受限值,比如某个系统中只有四个视频输入设备,程序按照本来的设计,理论上智能访问到四个设备的赋值范围,但是在某一刻出现了超出这个范围的访问。一个人怎么也不可能出现三条腿,一旦出现了,那就去查下程序,肯定是某个地方搞错了,跟踪一波。

指令错误,通常发生在硬件修改了内存的内容,应用程序一般也不可能修改到指令段。指令错误可能是未定义的指令,或者非法的指令,比如编译器对于结构体的对齐行为不同导致非法指令,通常发生在动态库代码执行的过程当中。

其它命令

打断点:break 命令用来设置断点,有以下几种情况:

  1. 多文件。使用 break FileName:LineNum。
  2. 单文件或者当前代码上下文所处的文件。break LineNum。
  3. 函数。break FunctionName。
  4. 指定代码段地址。break CodeAddress。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    (gdb) info b

    No breakpoints or watchpoints.

    (gdb) break print_info

    Breakpoint 1 at 0x8048412: file ./seg-fault.c, line 12.

    (gdb) break seg-fault.c:35

    Breakpoint 2 at 0x8048481: file ./seg-fault.c, line 35.

    (gdb) info b

    Num Type Disp Enb Address What

    1 breakpoint keep y 0x08048412 in print_info at ./seg-fault.c:12

    2 breakpoint keep y 0x08048481 in main at ./seg-fault.c:35

如上图,我打了两个断点,分别使用第一和第三种方法打的,使用 info b 查看断点情况,如果需要禁止断点的话就使用 disable breakpoint 1/enable breakpoint 1,如果要删除断点就使用 delete breakpoint 1,如果不加断点号,都全部默认对所有的断点进行操作。

监听某一个变量:watch 命令用来跟踪某一个变量的变化情况,只要这个变量被读取或者写入都会触发中断:

  1. watch Var。监听 Var 变量的改变动作,也就是变量 Var 的值每次被改变的时候就会中断。
  2. rwatch Var。监听 Var 变量的读取动作。
  3. awatch Var。监听 Var 变量的读取和写入动作。

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

(gdb) c

Continuing.

Breakpoint 1, print_info (king=0x804a0c0) at ./seg-fault.c:12

12 int i = 0;

(gdb) info local

i = -1073745412

local_king = 0xb7fc5ff4

(gdb) watch i

Hardware watchpoint 3: i

(gdb) c

Continuing.

skill[ely],name[K1].

Hardware watchpoint 3: i

Old value = -1073745412

New value = 1

print_info (king=0x804a0c0) at ./seg-fault.c:15

15 for (local_king = king; local_king != NULL; local_king = local_king->next) {

(gdb) c

Continuing.

skill[eat],name[K2].

Hardware watchpoint 3: i

Old value = 1

New value = 2

print_info (king=0x804a0c0) at ./seg-fault.c:15

15 for (local_king = king; local_king != NULL; local_king = local_king->next) {

如上所示,运行在第二个断点的时候停下,然后使用 watch 命令监听某一个变量,当这个变量的值被修改的时候就会触发一次中断,然后把值改变前后的状态打印出来。使用该命令可以监听某些变量是怎么被修改成非法值的。

End

Gdb 的命令集非常庞大,当我第一次看到的时候就被吓到了,因为其功能太过强大,同时也带来了学习成本,最好不要死记某一些命令,没可能记得全的,根据具体的场景摸索出调试步骤,第一次很困难,但是多试几次之后就会很顺畅了,基于案例的学习效率要比基于命令的学习效率高很多。

Gdb 还有其它很多的功能,本文就只总结下很简单的段错误调试案例。其它还有调试多线程的死锁类型问题,不仅仅是互斥锁,还有可能是其它类型的资源等待,死循环等待也是一种死锁,只不过不涉及到通常概念上的锁操作。其它的情况在以后的文章中会进行总结。

继续分享极客时间的课程,由于一次分享一篇太慢,所以以后每次会分享三篇或者是一整个章节,方便连续阅读,这个是我自行购买的付费课程,但是它有一个免费分享的机制(虽然名额有限),就是得微信客户端打开。(以下链接需要在微信客户端打开,如果是通过公众号【阅读原文】打开的话可以直接点击阅读):
[30 | 图的表示:如何存储微博、微信等社交网络中的好友关系?]
[29 | 堆的应用:如何快速获取到Top 10最热门的搜索关键词?]
[28 | 堆和堆排序:为什么说堆排序没有快速排序快?]
[27 | 递归树:如何借助树来求解递归算法的时间复杂度?]
[26 | 红黑树(下):掌握这些技巧,你也可以实现一个红黑树]
[25 | 红黑树(上):为什么工程中都用红黑树这种二叉树?]
自行评估自己是否需要咯,说实话这个课程看起来还是需要一定基础的,我看到后面也有点吃力了,一起进步吧

http://www.yellowmax2001.com/2018/12/16/Linux-gdb-%E6%AE%B5%E9%94%99%E8%AF%AF%E8%B0%83%E8%AF%95/

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 2020年金属非金属矿山(地下矿山)安全管理人员证模拟考试题库及金属非金属矿山(地下矿山)安全管理人员理论考试试题

    题库来源:安全生产模拟考试一点通公众号小程序2020年金属非金属矿山(地下矿山)安全管理人员证模拟考试题库及金属非金属矿山(地下矿山)安全管理人员理论考试试题是由公众号安全生产模拟考试一点通提供,金属非金属矿山(地下矿山)安全管理人员证模拟考试题库是根据金属非…...

    2024/4/30 20:23:07
  2. git单人开发入门使用笔记

    1、进入需要git管理的文件夹,初始化gitgit init这个命令的作用是初始化项目。初始化后会有一个.git的隐藏文件夹。这个.git的作用域是当前文件夹。$ git initAdministrator@USER-20190812PZ MINGW64 ~/Desktop/product $ git init Initialized empty Git repository in C:/Use…...

    2024/4/24 6:34:24
  3. C66x系列DSP架构

    目录概述C66x处理器内核C66x流水线结构 概述 C66X DSP是最新一代定点和浮点DSP,由4个乘法器组成,以实施单精度浮点运算。C66X DSP内核可同时运行多大8项浮点乘法运算,加之高达1.4GHz的时钟频率,使其具有很高的浮点处理性能。将多个C66x DSP内核与其他内核融合,即可创建出具…...

    2024/5/1 0:00:46
  4. 文史 篇一:《万历十五年》--黄仁宇

    01 明史的魅力近几年,明史特别火,《明朝那些事儿》引爆了大家对明朝趣闻杂谈的趋之若鹜。我谈不上什么明史爱好者,初高中的时候倒是担任过历史课代表。古语有:以史为镜可以知兴替、以人为镜可以知得失,生活工作10多年后,总想着要读些史书,既想着为自己微薄的历史知识做…...

    2024/4/24 6:34:29
  5. 昨天下午面了个哥们,也就问了4个问题,但好像他被我虐了

    公司最近在招 Java 开发岗,居然一天内就收了几百份简历!想不到吧?!都快面吐了,想招一个合适的技术同学太不容易了,需要去挖的细节太多了。一般来说,很多人都会被问 JVM原理、多线程、数据结构和算法、高并发、设计模式等内容,这是在评估普通 Java 面试者的知识结构。但…...

    2024/4/24 6:34:21
  6. (4.0.22.8)RecyclerView的空白区域点击响应

    在项目中使用RecyclerView嵌套RecyclerView,其中内部RecyclerView使用到了GridLayoutManager,在遇到item个数不满足一行时,会在页面右侧透出空白位, 如下图所示.目前点击空白位是没有点击响应事件的,我们想实现点击响应以扩大用户可以进入LandingPage的机会,在实现角度可…...

    2024/4/30 20:28:20
  7. 力扣160:相交链表

    这一道题的思路: 1、如国两个链表有一个为NULL,那就直接返回NULL; 2、如果两个链表相交,那么搜索的长度=短链表的长度; 3、题目默认不存在val相等,相等,突然不相等的情况; 遇到的问题:测试用例,返回1,预期是8 为什么? 因为题目想要的是节点一样而不是节点值一样,对…...

    2024/4/24 6:34:22
  8. 解决关于腾讯会议黑屏问题(ThinkpadE420型号)

    近期,由于2020年1月的疫情影响,开学时间一度被延期,毕设答辩被安排到线上,学院安排使用 腾讯会议app进行线上答辩。然而在测试阶段发现问题,打开页面出现黑屏问题,现就解决方案分享给出现类似问题的你。 问题描述:打开 腾讯会议 进入会议后,电脑视频显示灯亮起,但画面…...

    2024/4/30 23:15:07
  9. 锐捷路由技术系列

    1、锐捷路由技术 | 锐捷路由器基本功能的初始化配置 主机名(推荐配置): Ruijie(config)#hostnameNAME-txt 将设备命名为NAME-txt 接口描述(推荐配置): XWRJ(config)#interfaceinterface-number XWRJ(config-if-FastEthernet0/0)#description DESCRIPTION-txt系统时钟(必…...

    2024/4/30 20:56:05
  10. SpringBoot实现支付宝沙箱支付及退款

    一、在支付宝开放平台申请开通研发服务(需要实名认证),并根据官方文档生成公钥私钥,可参考这篇博客 二、springboot中集成支付宝沙箱支付引入alipay的sdk依赖<!--支付宝sdk依赖--> <dependency><groupId>com.alipay.sdk</groupId><artifactId&g…...

    2024/4/24 6:34:17
  11. TCP:SEQ号与ACK号

    三次握手Three-way Handshake一个虚拟连接的建立是通过三次握手来实现的1. (B) –> [SYN] –> (A)假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Reso…...

    2024/5/1 0:03:14
  12. andriod zipalign 支持apk 2G 以上的对齐

    该工具用python 实现 zipalign 兼容2G以上的apk 包括(64位) 项目地址: 本篇博客 只讲解 zip 32, 64的结构.也就是 zipalign 的实现原理: 首先看下zip 的结构吧:4.3.6 Overall .ZIP file format:[local file header 1][encryption header 1][file data 1][data descriptor 1]. …...

    2024/4/24 6:34:14
  13. 系统架构设计笔记(32)—— 新旧系统的分析和比较

    计算机技术飞速发展,日新月异,许多企业因为业务发展的需要和市场竞争的压力,需要建设新的企业信息系统。在这种升级改造的过程中,怎么处理和利用那些历史遗留下来的老系统,成为影响新系统建设成败和开发效率的关键因素之一。通常称这些老系统为遗留系统。 目前,学术和工业…...

    2024/4/16 22:18:52
  14. 分布式压测

    1、为什么使用分布式压测? 大家在使用jmeter压测过程中,可能会度遇到内存溢出的错误,这是为什么呢? 因为jmeter是java写的应用,java应用jvm堆内存heap受负载机硬件限制,虽然我们可以调整堆内存大小,但是单机无法支撑数以万计大并发,此时,需要多个负载机进行分压测试,…...

    2024/4/20 15:13:28
  15. SQL 插入、更新、删除记录语句

    1. SQL INSERT INTO 语法 ①无需指定要插入数据的列名,只需提供被插入的值即可 INSERT INTO table_name VALUES(value 1,value 2,value 3,...); ②需要制定列名和插入的值 INSERT INTO table_name (column 1, column 2, column 3,...) VALUES(value 1,value 2,value 3,...); 2…...

    2024/4/19 17:16:41
  16. 这样的宏定义用于变量调试真的没话说(C++)

    直接上代码,看注释部分,以及最后的运行结果,你会爱上它注:此段代码除了前面的宏定义部分,其他都引用自《C++语言程序设计》清华大学公开课#include <bits/stdc++.h> using namespace std;//#define D(a) cout<<#a<<endl;a // 在宏定义中,#x 表示变量x的…...

    2024/4/19 14:34:08
  17. [读书笔记]C++ Primer 第7章 类

    struct Sale_data{ std::string isbn() const {return bookNo; } std::string bookNo; } 1.函数调用 类内定义的函数是隐式的inline函数。 Sale_data data; data.isbn(); 调用成员函数时,实际是在为data调用。 成员函数通过this(额外的隐式参数)来访问data。编译器负责把…...

    2024/4/16 22:19:52
  18. Condition(等待通知机制)

    Condition简介...

    2024/4/15 7:29:52
  19. 【简单】1160. 拼写单词

    【题目】 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。 来源:leetcode 链接:https://leetcode-cn.com/problems/find-w…...

    2024/4/16 22:19:40
  20. RIP——RIP基本概念

    目录RIP基本概念RIP路由更新及接收RIP路由更新过程1.路由器初始启动2.初次交换路由信息3.路由完成收敛RIP路由更新与路由表度量值报文类型及格式1.RIPv1的报文结构2.RIPv2的报文结构计时器Silent-InterfaceRIP基本概念RIP(Routing Information Protocol,路由信息协议)就是最…...

    2024/4/16 22:20:46

最新文章

  1. LeetCode 刷题 -- Day 6

    今日题目 题目难度备注102. 二叉树的层序遍历 中等一招鲜吃遍天107. 二叉树的层序遍历 II &#xff09;中等199. 二叉树的右视图 中等637. 二叉树的层平均值简单429. N 叉树的层序遍历中等515. 在每个树行中找最大值中等116. 填充每个节点的下一个右侧节点指针中等104. 二叉树…...

    2024/5/1 0:27:21
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 汽车统一诊断服务UDS协议参考文章和视频

    UDS基础知识介绍-电子发烧友网 【图解UDS】UDS汽车诊断标准协议&#xff08;ISO14229&#xff09;带你入门到精通-有驾 车载测试之UDS诊断协议9&#xff1a;0x27服务&#xff1a;解锁ECU_哔哩哔哩_bilibili UDS诊断的22服务&#xff08;DID读取数据&#xff09;和2E服务&…...

    2024/4/29 23:11:44
  4. [C++/Linux] UDP编程

    一. UDP函数 UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;是一种无连接的网络协议&#xff0c;用于在互联网上交换数据。它允许应用程序发送数据报给另一端的应用程序&#xff0c;但不保证数据报能成功到达&#xff0c;也就是说&#xff0c;它…...

    2024/4/30 4:30:51
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57