当前位置: 首页 > 编程日记 > 正文

GDB调试进阶

GDB 调试
-------------------------------------------------------------------------------
gdb 帮助文档
help -- 查看 gdb 的命令种类
help <CmdType> -- 查看 CmdType 种类的 gdb 命令
apropos <keyWord> -- 查看关键字 keyWord 的相关命令
info <keyWord> -- 查看关键字 keyWord 调试信息
show <keyWord> -- 查看关键字 keyWord gdb 本身设置信息

gdb 中运行 unix 的 shell 程序
shell <command string> -- 调用 unix 的 shell 来执行 <command string>,环境变量 shell 中定义的 unix 的 shell 将会被用来执行 <command string>,如果 shell 没有定义,那就使用 unix 的标准 shell:/bin/sh.(在 windows 中使用 command.com 或 cmd.exe)
make <make-args> -- 等价于 “shell make <make-args>”

历史记录
当你用 gdb 的 print 查看程序运行时的数据时,你每一个 print 都会被 gdb 记录下来.gdb 会以 $1, $2, $3 ...这样的方式为你每一个 print 命令编上号.于是,你可以使用这个编号访问以前的表达式,如 $1.这个功能所带来的好处是,如果你先前输入了一个比较长的表达式,如果你还想查看这个表达式的值,你可以使用历史记录来访问,省去了重复输入.

启动程序
run <arg ...> -- 启动程序,<arg ...> 为程序运行时候需要输入的参数.也可用 set args 命令去设置运行参数.简写为 r
--------------------------------------------------------------------------------
GDB 环境设置
gdb 设置
设置显示选项 地址 set print address <on/off> -- 打开地址输出,当程序显示函数信息时,gdb会显出函数的参数地址.系统默认为打开.
show print address -- 查看 print address 选项信息

数组元素单独行显示 set print array <on/off> -- 打开时数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔.这个选项默认是关闭的.
show print array -- 查看 print array 选项信息

显示数组元素显示 set print elements <number-of-elements> -- 设置数组的显示的最大长度,设置为 0,则表示不限制.
show print elements -- 查看 print elements 选项信息.

设置字符串显示 set print null-stop <on/off> -- 如果打开那么当显示字符串时,遇到结束符则停止显示.这个选项默认为 off.
show print null-stop -- 查看 print null-stop 选项信息

设置结构体变量显示 set print pretty <on/off> -- 结构体优雅显示
show print pretty -- 查看 gdb 是如何显示结构体的.

设置字符显示 set print sevenbit-strings <on/off> -- 符显示,是否按“/nnn”的格式显示,如果打开,则字符串或字符数据按/nnn显示,如“/065”.
show print sevenbit-strings -- 查看字符显示开关是否打开.

设置联合体显示 set print union <on/off> -- 设置显示结构体时,是否显式其内的联合体数据.
show print union -- 查看联合体数据的显示方式

设置对象显示 set print object <on/off> -- 在 C++ 中,如果一个对象指针指向其派生类,如果打开这个选项,gdb 会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,gdb 就不管虚函数表了.这个选项默认是 off.
show print object -- 查看对象选项的设置.

设置静态成员显示 set print static-members <on/off> -- 这个选项表示,当显示一个 C++ 对象中的内容是,是否显示其中的静态数据成员.默认是 on.
show print static-members -- 查看静态数据成员选项设置.

设置虚函数表显示 set print vtbl <on/off> -- 当此选项打开时,gdb 将用比较规整的格式来显示虚函数表时.其默认是关闭的.
show print vtbl -- 查看虚函数显示格式的选项.

设置运行程序的相关环境及其参数 指定源文件的路径 directory <dirname ... > -- 加一个源文件路径到当前路径的前面.如果你要指定多个路径,UNIX 下你可以使用“:”,Windows 下你可以使用“;”.缩写 dir
directory -- 清除所有的自定义的源文件搜索路径信息.
show directories -- 显示定义了的源文件搜索路径.

运行参数 set args -- 可指定运行时参数
show args -- 命令可以查看设置好的运行参数

运行环境 path <dir> -- 可设定程序的运行路径
show paths -- 查看程序的运行路径
set environment varname=value -- 设置环境变量
show environment [varname] -- 查看环境变量

工作目录 cd <dir> -- 相当于shell的cd命令
pwd -- 显示当前的所在目录

程序的输入输出 info terminal -- 显示你程序用到的终端的模式
tty -- 命令可以指写输入输出的终端设备
重定向控制程序输出

堆栈帧设置 set backtrace <limit> -- 设置堆栈帧的最大显示数量,默认是没有限制

调试模式 set step-mode [on | off] -- step-mode 模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住.这个参数有很利于查看机器码.

--------------------------------------------------------------------------------
GDB 源码查看
显示源代码
list <linenum> -- 显示程序第 linenum 行的周围的源程序.
list <function> -- 显示函数名为 function 的函数的源程序.
list <filename:linenum> -- 哪个文件的哪一行.
list <filename:function> -- 哪个文件中的哪个函数.
list <offset> -- 当前行号的正/负 offset 偏移量那那行.
list -- 显示当前行后面的源程序.
list - -- 显示当前行前面的源程序.
list <first>, <last> -- 显示从 first 行到 last 行之间的源代码.若无 first 则显示从当前行到 last 之间的源代码.

设置和获得显示源码的行数
set listsize <count> -- 设置一次显示源代码的行数.
show listsize -- 查看当前listsize的设置.

搜索源代码
forward-search <regexp> -- 向后面搜索.正则表达式为 regexp 的关键字
search <regexp> -- 向后面搜索.正则表达式为 regexp 的关键字
reverse-search <regexp> -- 向前面搜索.正则表达式为 regexp 的关键字

源代码的内存
info line <linenum> -- 查看行号为 linenum 源代码在内存中的地址.
info line <function> -- 查看函数在源代码在内存中的地址.
info line <filename:linenum> -- 查看 filename 文件的第 linenum 行源代码在内存中的地址.
info line <filename:function> -- 查看 filename 文件的 function 函数在源代码在内存中的地址.

查看汇编代码
disassemble -- 查看源程序的当前执行时的机器码,这个命令会把目前内存中的指令 dump 出来.
--------------------------------------------------------------------------------
GDB 停止点设置及维护
断点(BreakPoint)
设置断点:(threadno 指定了线程的 ID,注意,这个 ID 是 gdb 分配的,可以通过 "info threads" 命令来查看正在运行程序中的线程信息) break thread <threadno> -- break命令没有参数时,表示在下一条指令处停住.
break +offset thread <threadno> -- 在当前行号的后面的 offset 行停住.(offiset 为自然数)
break -offset thread <threadno> -- 在当前行号的前面的 offset 行停住.(offiset 为自然数)
break <linenum> thread <threadno> -- 在指定行号停住.
break filename:linenum thread <threadno> -- 在源文件filename的linenum行处停住.
break <function> thread <threadno> -- 在进入指定函数时停住.
break filename:function thread <threadno> --在源文件filename的function函数的入口处停住.
break *address -- 在程序运行的内存地址处停住.
break ... thread <threadno> if <condition> -- ...可以是上述的参数,condition表示条件,在条件成立时停住.比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序.
tbreak -- 设置只停止一次的断点.用法和 break 类似

查看断点 info breakpoints [n]
info break [n]

观察点(WatchPoint) -- 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序.
设在观察点 watch <expr> -- 为表达式(变量)expr设置一个观察点.一量表达式值有变化时,马上停住程序.
rwatch <expr> -- 当表达式(变量)expr被读时,停住程序.
awatch <expr> -- 当表达式(变量)的值被读或被写时,停住程序.

查看观察点 info watchpoints -- 列出当前所设置了的所有观察点.

捕捉点(CatchPoint) -- 设置捕捉点来补捉程序运行时的一些事件.如:载入共享库(动态链接库)或是 C++ 的异常《/p>
设置捕捉点 catch <event> -- 当event发生时,停住程序.event可以是下面的内容: throw 一个 C++ 抛出的异常.(throw 为关键字)
catch 一个 C++ 捕捉到的异常.(catch 为关键字)
exec 调用系统调用 exec 时.(exec 为关键字,目前此功能只在 HP-UX 下有用)
fork 调用系统调用 fork 时.(fork 为关键字,目前此功能只在 HP-UX 下有用)
vfork 调用系统调用 vfork 时.(vfork 为关键字,目前此功能只在 HP-UX 下有用)
load 或 load <libname> 载入共享库(动态链接库)时.(load 为关键字,目前此功能只在 HP-UX 下有用)
unload 或 unload <libname> 卸载共享库(动态链接库)时.(unload 为关键字,目前此功能只在 HP-UX 下有用)

tcatch <event> -- 只设置一次捕捉点,当程序停住以后,应点被自动删除.

维护停止点
清除停止点 clear -- 所有的已定义的停止点.
clear <function> -- 清除所有设置在函数上的停止点.
clear <filename:function> -- 清除所有设置在函数上的停止点.
clear <linenum> -- 清除所有设置在指定行上的停止点.
clear <filename:linenum> -- 清除所有设置在指定行上的停止点.

删除停止点 delete [range] -- 删除停止点.其简写命令为 d.

禁用停止点 disable [range] -- 禁用停止点

启用停止点 enable [range] -- 启用停止点.
enable once [rang] -- 启用停止点一次,当程序停止后,该停止点马上被 gdb 自动 disable.
enable count [rang] -- 启用停止点 count 次,当程序停止后,该停止点马上被 gdb 自动 disable.
enable delete [rang] -- 启用停止点一次,当程序停止后,该停止点马上被 gdb 自动删除.

停止条件维护 -- 以用 condition 命令来修改断点的条件.(只有break和watch命令支持if,catch目前暂不支持if) condition <bnum> <expression> -- 修改断点号为bnum的停止条件为expression.
condition <bnum> -- 清除断点号为bnum的停止条件.

忽略停止点 N 次 ignore <bnum> <count> -- 表示忽略断点号为 bnum 的停止条件 count 次.

为停止点设定运行命令 格式:
commands [bnum]
       ... command-list ...
       // 为断点号 bnumi写一个命令列表.当程序被该断点停住时,gdb 依次运行命令列表中的命令.
end
例如:
break foo if x>0
  commands
       printf "x is %d/n",x
       continue
end
--------------------------------------------------------------------------------
信号(Signals)
添加信号处理
handle <signal> <keywords...>
在 gdb 中定义一个信号处理.信号 <signal> 可以以 SIG 开头或不以 SIG 开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从 SIGIO 信号到 SIGKILL 的信号,其中包括 SIGIO, SIGIOT, SIGKILL 三个信号),也可以使用关键字 all 来标明要处理所有的信号.一旦被调试的程序接收到信号,运行程序马上会被 gdb 停住,以供调试.其 <keywords> 可以是以下几种关键字的一个或多个.若没有 keywords 则查看奇信号的处理状态 nostop -- 当被调试的程序收到信号时,gdb 不会停住程序的运行,但会打出消息告诉你收到这种信号.
stop -- 当被调试的程序收到信号时,gdb 会停住你的程序.
print -- 当被调试的程序收到信号时,gdb 会显示出一条信息.
noprint -- 当被调试的程序收到信号时,gdb 不会告诉你收到信号的信息.
pass -- 当被调试的程序收到信号时,gdb 不处理信号.这表示,gdb 会把这个信号交给被调试程序会处理.
noignore -- 当被调试的程序收到信号时,gdb 不处理信号.这表示,gdb 会把这个信号交给被调试程序会处理.
nopass -- 当被调试的程序收到信号时,gdb 不处理信号.这表示,gdb 会把这个信号交给被调试程序会处理.
1gnore -- 当被调试的程序收到信号时,gdb 不会让被调试程序来处理这个信号.

查看处理信号
info signals -- 查看有哪些信号在被 gdb 检测中.
info handle -- 查看有哪些信号在被 gdb 检测中.
--------------------------------------------------------------------------------
GDB 程序调试

恢复执行
continue [ignore-count] -- ignore-count 表示忽略其后的断点次数.恢复程序运行,直到程序结束,或是下一个断点到来.缩写 c
fg [ignore-count] -- ignore-count 表示忽略其后的断点次数.恢复程序运行,直到程序结束,或是下一个断点到来.缩写 c

单步调试
step <count> -- 单步跟踪,如果有函数调用,它会进入该函数.count 表示执行后面 count 条语句,不加则默认为 1.
next <count> -- 同样单步跟踪,如果有函数调用,他不会进入该函数.count 表示执行后面 count 条语句,不加则默认为 1.

跟踪机器指令
       与之一样有相同功能的命令是 “display/i $pc” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
stepi 或 si -- 单步跟踪一条机器指令,简写 si
nexti 或 ni -- 单步跟踪一条机器指令,简写 ni

函数调试
finish -- 运行程序,直到当前函数完成返回.并打印函数返回时的堆栈地址和返回值及参数值等信息.
return <expression> -- 使函数以 expression 表达式返回出去,忽略还没有执行的语句.若无返回 void 出去
call <expr> -- 表达式中可以一是函数,以此达到强制调用函数的目的.并显示函数的返回值,如果函数返回值是void,那么就不显示.
print 与 printf 也可以做到类似的功能和 call 的不同是,如果函数返回 void,call 则不显示,print 则显示函数返回值,并把该值存入历史数据中.

循环体调试
until -- 可以运行程序直到退出循环体.简写 u

修改变量值
print varname=var -- 修改被调试程序运行时的变量值
set var varname=value -- 修改被调试程序运行时的变变量
whatis varname -- 查看变量的类型

跳转执行
jump <linespec> -- 指定下一条语句的运行点.<linespce> 可以是文件的行号,可以是 file:line 格式,可以是 +num 这种偏移量格式.表式着下一条运行语句从哪里开始.
jump <address> -- 跳转到指定的程序内存地址运行.<address> 是代码行的内存地址.
注意 jump 指令不会改变当前的程序栈中的内容,所以,当你从一个函数跳到另一个函数时,当函数运行完返回时进行弹栈操作时必然会发生错误.
jump 命令只是改变了指令寄存器中的值.于是可以使用 “set $pc” 来更改跳转执行的地址.如: set $pc = 0x485


产生信号量
signal <signal> -- 产生一个 signal 信号.UNIX 的系统信号量通常从 1 到 15.所以 <signal> 取值也在这个范围.
--------------------------------------------------------------------------------
GDB 运行是数据
查看运行时数据
print /<f> <expr> -- 查看当前程序的运行数据.简写 p. <expr> 是表达式 @ -- 是一个和数组有关的操作符,在后面会有更详细的说明.在 @ 左边是数组的地址,右边是数组的长度,eg:
array@len
:: -- 指定一个在文件或是一个函数中的变量.
{<type>} <addr> --表示一个指向内存地址<addr>的类型为type的一个对象.

<f>是输出的格式 d -- 按十进制格式显示变量.
u -- 按十六进制格式显示无符号整型.
o -- 按八进制格式显示变量.
t -- 按二进制格式显示变量.
a -- 按十六进制格式显示变量.
c -- 按字符格式显示变量.
f -- 按浮点数格式显示变量.

注意: 1.若出现变量重名,局部变量会隐藏全局变量.若想查看全局变量的值时,可以使用“::”操作符.
2.可以通过这种形式指定你所想查看的变量 eg:
    *'filename'::variable
    *function::variable

printf "fmt",arg,... -- 打印格式化字符灿 fmt.

查看内存
examine/<n/f/u> <addr> -- 来查看内存地址中的值.简写 x <n/f/u> n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容.
f 表示显示的格式 s -- 按字符串格式显示内存地址内容.
i -- 查看内存地址的机器指令内容
x -- 按十六进制格式显示地址内容.
d -- 按十进制格式显示地址内容.
u -- 按十六进制格式显示无符号整型.
o -- 按八进制格式显示地址内容.
t -- 按二进制格式显示地址内容.
a -- 按十六进制格式显示地址内容.
c -- 按字符格式显示地址内容.
f -- 按浮点数格式显示地址内容.

u 表示从当前地址往后请求的字节数,如果不指定的话,gdb默认是 4 个 bytes. b -- 表示单字节
h -- 表示双字节
w -- 表示四字节
g -- 表示八字节

<addr> 表示一个内存地址.

自动显示
设置自动显示 display/<fmt> <expr> -- 自动显示 expr 表达式
display/<fmt> <addr> -- 自动显示 addr 地址 fmt 表示显示的格式
i -- 输出格式为机器指令码,也就是汇编.
s -- 输出格式为字符串

删除自动显示 undisplay <range> -- 删除自动显示
delete display <range> -- 删除自动显示

启用和禁自动显示 sable display <range> -- 禁用自动显示
enable display <range> -- 启动自动显示

查看栈信息
backtrace <n> -- 擦看函数栈信息,简写 bt n 若是正数,只打印栈顶上 n 层的栈信息,
若是负数,只打印栈顶下 n 层的栈信息,
若无则打印当前的函数调用栈的所有信息

frame -- 会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句.
info frame -- 这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址.
info args -- 打印出当前函数的参数名及其值.
info locals -- 打印出当前函数中所有局部变量及其值.
info catch -- 打印出当前的函数中的异常处理信息.

切换函数栈位置
frame <n> -- 切换到第 n 层函数栈位置,简写 f.
p <n> -- 表示上面移动 n 层,可以不打 n,表示向上移动一层.
down <n> -- 表示向栈的下面移动 n 层,可以不打 n,表示向下移动一层.
select-frame <n> -- 类似 frame 命令.不打印出栈层信息.
up-silently <n> -- 类似 up 命令.不打印出栈层信息.
down-silently <n> -- 类似 down 命令.不打印出栈层信息.

查看寄存器
info registers -- 查看寄存器的情况.(除了浮点寄存器)
info all-registers -- 查看所有寄存器的情况.(包括浮点寄存器)
info registers <regname> -- 查看所指定的寄存器的情况.

线程查看与切换线程
info threads -- 查看当前线程
thread <threadno> -- 切换到 threadno 的线程,简写 t
--------------------------------------------------------------------------------
自定义命令

定义一个命令
格式
define comdName
      ...
end
条件语句
if cond_expr
      ...
else
      ...
end
循环语句
while cond_expr
      ...
end

定义一个命令的文档信息(在 help cmdName 的时候显示)
document cmdName
      ...
end

查看自定命令
help user-define -- 查看所有用户自定义的命令
show user cmdName -- 查看用户定义的 cmdName 的命令.
help cmdName -- 查看用户自定义的 cmdName 的帮助文档
show max-user-call-depth -- 查看用户自定义命令的递归最大深度,缺省是 1024
set-user-call-depth <limit>-- 设置用户自定义命令的递归最大深度.

转载于:https://www.cnblogs.com/xfei-zhang/p/5086860.html

相关文章:

RubyGems 库发现了后门版本的网站开发工具 bootstrap-sass

安全研究人员在官方的 RubyGems 库发现了后门版本的网站开发工具 bootstrap-sass。该工具的下载量高达 2800 万次&#xff0c;但这并不意味着下载的所有版本都存在后门&#xff0c;受影响的版本是 v3.2.0.3&#xff0c;研究人员呼吁用户尽可能快的更新&#xff0c;认为可能有数…

读大叔深入理解javascript(2)

Module模式的应用&#xff1a; var Caculator function(eqt){var box document.getElementById(eqt);return {add:function(x,y){return xy;}} }; var a new Caculator(11); a.add(1,3); // return 4 这种方式每次都需要new 一下&#xff0c;也就是说每个实例在内存里都是一…

android 无法接收广播_别告诉我你不认识Android中广播接收者(二)

前面我们了解了什么是广播接收者与广播接收者的创建&#xff0c;这一次我们要接着继续去了解广播接收者的相关知识&#xff0c;这些知识包括广播接收者的注册、自定义广播与广播的类型。当我们学习完广播接收者之后&#xff0c;该如何才能让它起到作用呢&#xff1f;还有广播接…

jQuery中$(function(){})与(function($){})(jQuery)的区别

首先&#xff0c;这两个函数都是在页面载入后执行的函数&#xff0c;其中两者的区别在于&#xff1a; 在jQuery中$(function(){})等同于jQuery(function(){})&#xff0c;另一个写法为jQuery(document).ready(function(){ })&#xff0c;在DOM加载完成之后立即执行&#xff0c;…

UITableView注意点

在iOS应用中&#xff0c;UITableView应该是使用率最高的视图之一了。iPod、时钟、日历、备忘录、Mail、天气、照片、电话、短信、 Safari、App Store、iTunes、Game Center⋯几乎所有自带的应用中都能看到它的身影&#xff0c;可见它的重要性。然而在使用第三方应用时&#xff…

083、Prometheus架构(2019-05-05 周日)

参考https://www.cnblogs.com/CloudMan6/p/7692765.htmlPrometheus 是一个非常优秀的监控工具&#xff0c;准确的说&#xff0c;应该是监控方案。Prometheus 提供了监控数据搜集、存储、处理、可视化和告警一整套的解决方案。Prometheus 重要组件的架构如下&#xff1a;Prometh…

自动获取mysql建表语句_脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明...

常规建表语句&#xff1a;CREATE TABLE test_table (id int(11) NOT NULL,name char(64) NOT NULL,password char(64) NOT NULL,PRIMARY KEY (name,id)) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENTtest;解析脚本代码&#xff1a;# coding:utf-8import redeftable_design_transf…

对云风 cstring 第二次解析

前言 从明天起 关心粮食和蔬菜 我有一所房子 面朝大海 春暖花开 本文前提条件 1.了解 posix 线程 2.了解 原子操作 3.具备简单C基础,或者 你也敲一遍. 如果上面不太清楚,你可以翻看我以前的博客,或者百度搜索. 结论 1.云风前辈的 玩具 cstring 有点坑, 内存管理很随意(也可能时…

C# 获取当前路径方法

//获取包含清单的已加载文件的路径或 UNC 位置。 public static string sApplicationPath Assembly.GetExecutingAssembly ( ).Location; //result: X:\xxx\xxx\xxx.dll (.dll文件所在的目录.dll文件名) //获取当前进程的完整路径&#xff0c;包含文件名(进程名)。 string st…

土地档案管理系统需求分析

土地档案管理系统需求分析 1 项目背景 随着国土大面积调查工作的全面展开和城镇地籍管理工作得以日趋细化&#xff0c;各种野外调查数据&#xff0c;不同比例尺图件资料急剧增加。特别是城市建设的空前发展以及土地有偿使用法规的实施&#xff0c;使得地籍变更日益频繁、地籍信…

mysql8.0 服务移除_Linux下彻底删除Mysql 8.0服务的方法

观看本文前最好有一定的Linux命令基础&#xff0c;具体为centos7.3环境中清除使用yum安装的Mysql卸载前请先关闭Mysql服务service mysql stop使用 rpm 命令的方式查看已安装的mysqlrpm -qa|grep mysql开始卸载Mysql服务使用yum安装需要先进行清除服务等yum remove mysql mysql-…

老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

老李推荐&#xff1a;第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中&#xff0c;HierarchyViewer会调用自己的成员方法setupViewServer来把ViewServer装备好&#xff0c;那么我们这里先看下这个方法…

泛型详解 高级进阶

泛型详解 高级进阶 转载于:https://www.cnblogs.com/thiaoqueen/p/10830499.html

vim 的中文编码问题

在vim编辑的时候会出现中文编码问题&#xff0c;我们可以这样解决在/usr/share/vim/的目录下有一个vimrc文件打开这个文件&#xff0c;你可能要用sudo打开然后在最后输入这行代码保存即可&#xff1a;$> sudo vim /usr/share/vim/vimrc set fileencodingsutf-8,gb2312,gbk,g…

mysql回表_到底什么情况下mysql innodb会发生回表操作?

谢邀MySQL innodb的主键索引是簇集索引&#xff0c;也就是索引的叶子节点存的是整个单条记录的所有字段值&#xff0c;不是主键索引的就是非簇集索引&#xff0c;非簇集索引的叶子节点存的是主键字段的值。回表是什么意思&#xff1f;就是你执行一条sql语句&#xff0c;需要从两…

经验分享:CSS浮动(float,clear)通俗讲解

很早以前就接触过CSS&#xff0c;但对于浮动始终非常迷惑&#xff0c;可能是自身理解能力差&#xff0c;也可能是没能遇到一篇通俗的教程。 前些天小菜终于搞懂了浮动的基本原理&#xff0c;迫不及待的分享给大家。 写在前面的话&#xff1a; 由于CSS内容比较多&#xff0c;小菜…

前端开发学习Day27

第27天&#xff0c;我只做了一个案例。布局部分花了一整个上午&#xff0c;很乱。代码还是写的少&#xff0c;没有思路。下午好不容易做好了布局&#xff0c;写脚本的时候又被卡死&#xff0c;我现在严重怀疑自己的大脑是怎么长的……本着不抛弃不放弃的原则&#xff0c;晚上找…

对象模型创建SharePoint2010多选字段SPFieldMultiChoice

在使用页面方式创建SharePoint 2010的选项(Choice)字段时&#xff0c;选项字段的显示方式有3种&#xff1a;下拉列表、单选按钮、多选。但是如果使用对象模型创建时&#xff0c;下拉列表和单选按钮只能使用SPFieldChoice类来创建&#xff0c;而多选显示方式就要使用SPFieldMult…

docker mysql忘记密码_docker基于mysql镜像构建mysql容器忘记密码解决办法

环境&#xff1a;[rootmaster-106 ~]# cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core)[rootmaster-106 ~]# docker --versionDocker version 19.03.13, build 4484c46d9dMySQL 5.7.31# 进入mysql容器[rootmaster-106 ~]# docker ps|grep mysql05759803adb9 mysq…

Android App优化之延长电池续航时间

禁用广播接收器 确保广播接收器在真正须要时才运行指令&#xff0c;在onResume中当中广播接收器&#xff0c;在onPause中禁用。 在manifest文件里声明广播接收器时&#xff0c;事先默认配置成禁用的 <receiver android:name".BatterReceiver" android:enabled&quo…

myeclipse中安装svn插件

1、下载最新的SVN包(我下的是1.0.6版)&#xff1a; http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID2240 2、在你的磁盘上任意位置创建文件夹&#xff1a;“myplugins/svn”。名字可以任取&#xff0c;为了方便插件管理&#xff0c;建议名称为“myplugins…

字节码学院全栈学习笔记

今天正式加入字节码学院&#xff0c;努力学习Java全栈&#xff0c;争取在6个月内称为一个了解软件行业的人&#xff0c;本人在这里立铁为证&#xff1a; 搭建vue 组件化开发环境时&#xff0c;需要安装node.js step 01: nodejs 安装 sudo apt updatesudo apt install nodejsno…

mysql 索引 二叉树_MySQL 的索引,为什么是 B+而不是平衡二叉树

数据库为什么使用 B 树&#xff1f;前言讲到索引&#xff0c;第一反应肯定是能提高查询效率。例如书的目录&#xff0c;想要查找某一章节&#xff0c;会先从目录中定位。如果没有目录&#xff0c;那么就需要将所有内容都看一遍才能找到。索引的设计对程序的性能至关重要&#x…

Spring Boot 2 快速教程:WebFlux 快速入门(二)

2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号&#xff1a;泥瓦匠BYSocket 」欢迎关注和转载&#xff0c;保留摘要&#xff0c;谢谢&#xff01; 02&#xff1a;WebFlux 快速入门实践 文章工程&#xff1a; JDK 1.8…

关于捕获键盘信息的processDialogkey方法

在一些控件里的keydown方法&#xff0c;没有办法捕获所有的按键消息 比如自己写一个窗体控件库&#xff0c;继承了UserControl 但是没有办法捕获一些键&#xff0c;比如方向键等 所以必须重载 processDialogkey 方法 processDialogkey 的描述 在msdn中是这样的 在消息预处理过程…

Visual Studio进行Web性能测试- Part III

原文作者&#xff1a;Ambily.raj 对于一个多用户的应用程序&#xff0c;性能是非常重要的。性能不仅是执行的速度&#xff0c;它包括负载和并发方面。Visual Studio是可以用于性能测试的工具之一。Visual Studio Test版或Visual Studio 2010旗舰版为自动化测试提供了支持。 介绍…

php mysql source_Mysql数据库导入命令Source详解

Mysql数据库导入命令Source详解几个常用用例&#xff1a;1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u root -p dataname >dataname.sql这个时候会提示要你输入root用户名的密码,输入密码后dataname数据库就成功备份在mysql/bin/目录中.…

课堂练习(续)

源程序&#xff1a; Text_2.java import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.te…

任务二:1、选择器 2、连接集中状态的顺序 3、浮动的用发和原理 4、盒模型在IE和Google等不同浏览器的区别与联系...

1、选择器类型 标签选择器&#xff0c;类选择器&#xff0c;ID选择器&#xff0c;组合选择器&#xff0c;伪类和伪元素&#xff0c;属性选择器&#xff0c;子选择器&#xff0c;同胞选择器&#xff0c; :not()选择器 1、同胞选择器 相邻同胞标签&#xff1a; h2 p{ color:red…

struct发送与显示中文

中文的编码显示常常是一个让人头痛的问题&#xff0c;网络传输的时候中文也会变成二进制的流&#xff0c;接收方显示就成了一个大问题。 今天使用python的struct模块来对数据封包解包&#xff0c;同样有这个问题。解决方法是&#xff1a;一般会把python代码文件声明为utf-8编码…