JUST DO IT ~

我只想当个程序员

2015年12月27日

     摘要: 检查宏定义
WIN32
_DEBUG
_WINDOWS
_USRDLL  阅读全文
posted @ 2017-08-16 10:43 小高 阅读(355) | 评论 (0)编辑 收藏

GDB笔记

概览

基础

用户态会话

调试模式

  • 转储文件调试

    瞬间静态分析,进程死状态。
    gdb –core=file

  • 交互调试

    1. 调试新进程
      gdb exe
      gdb –args exe [args]

    2. 调试已经运行的进程
      gdb –pid= 进程号

    3. 内核调试

3种调试已有进程

gdb exe

.

gdb –args exe [args]

.

gdb
file exe
run [args]

.

gdb –args gcc a.c -o a

命令行参数

show args

set args 多次运行设置命令行参数

环境变量和执行路径

path directory

.

show paths

.

show environment [varname]

.

set environment varname[=value] 清除或者设置环境变量

工作目录

继承进入gdb工作目录

改变工作目录

cd dirctory

显示路径

pwd

输入输出

info terminal
run > a.txt
tty /dev/ttyb

远程调试可用这些辅助。

inferior 下层 多个进程调试

inferior gdb维护的一系列对象,每个inf对应一个调试目标进程。

info inferior 显示下层信息
NULL 程序没有跑或者已经终止
clone-inferior -copies 2 复制当前下层2份

(gdb) info inferiors
Num Description Executable
* 1 process 10087 /home/gao/code/a
(gdb) clone-inferior -copies 2
Added inferior 2.
Added inferior 3.
(gdb) info inferiors
Num Description Executable
3 程序没有跑或者已经终止 /home/gao/code/a
2 /home/gao/code/a
* 1 process 10087 /home/gao/code/a
(gdb)

切换下程

inferior 2 切换2这个下程。
进程号是0,没开始运行。
run 运行起来。

.

增加一个运行下层

add-inferior -exec executeable 增加一个运行下层
比如说调试一个服务端程序,一个客户端程序。

remove-inferior n 删掉一个下层
detach inferior 继续运行 quit
kill inferior 调试进程退了,但是inferior纪录还在。

Tab 帮助

(gdb) remove-
remove-inferiors remove-symbol-file
(gdb) remove-
remove-inferiors remove-symbol-file
(gdb) remove-

file 命令

file a.exe 可自行文件和符号文件是一个文件

可自行文件和符号文件分开

exec-file 指定目标文件

.

symbol-file 指定符号文件

run 开始运行
可以支持 run > >> < 重定向

set args 清理命令行参数

附加到进程

gdb –pid= pid

attach pid

终止调试进程

detach pid 分离进程继续运行

.

quit 进程退出

.

q
ctrl + D

执行控制

断点

软件断点

break 普通
tbreak 一次性
rbreak 正则表达式一批断点

  • 基于cpu断点指令,x86 int3机器码0xcc。
  • 替换断点位置的指令
  • CPU自执行这里触发断点异常。
  • 没有断点数量限制。

硬件断点

  • 基于cpu调试寄存器,dr0~dr7,数量限制。x86可以设定4个断点。数量限制。
  • 不修改代码,在只读内存上设置断点。EEPROM上的代码设置。
  • 有数量限制。

location

  • linespec

  1. 行号
  2. -/+ 偏移
  3. 文件名 :行号
  4. 函数名
  5. 函数:标号
  6. 文件名:函数
  7. 标号

  • explicit

  1. -source linename
  2. -function function
  3. -label label
  4. -line number

  • address location break * address

实践

file banner
b main 中断在main函数
info funciton useage 显示useage函数地址
info *0x88888e4 直接写地址设定断点
info b 显示所有断点
list usage 显示useage函数
b line.c:11
b +2 当前显示到14行+2行所以设定在17行

虚拟机设定硬件断点会失败.
(gdb)hbreak hd_ioctl
(gdb) info b
物理机可以设定.

(gdb) hbreak v
Hardware assisted breakpoint 2 at 0x40053a: v. (2 locations)
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y
breakpoint already hit 1 time
1.1 y 0x000000000040054f in main at a.c:10 inf 1
1.2 y 0x000000000040054f in main at a.c:10 inf 2
2 hw breakpoint keep y
2.1 y 0x000000000040053a in v at a.c:4 inf 1
2.2 y 0x000000000040053a in v at a.c:4 inf 2
(gdb)

管理断点

info b 显示断点
delete 1 删除
disable 1
enable 1
delete 删除所有的断点
clear sum 删除sum函数入口的所有断点

扩展断点

watchpoint 监视一个表达式,值变化中断。

watch a*b+c/d
watch *( int * )

watch fd 监控局部变量fd
c 继续运行
info b //
注意,x86硬件调试,写操作,执行过这一行,gdb显示下一行,要看上一行。hw watchpoint,在x86平台wachtpoint基于硬件实现,其他平台可能是基于软件实现。 vc6纯软件执行,执行目标速度低。
执行位置超过当前区域,无效监视点会被删除。

访问监视点
rwatch 读停下来。
awatch 读或写停下来。 awatch fd
watch -l

b hd_ioctl thread 1

info threads 带* 当前线程

繁忙函数解决方案

b hd_ioctl thread 1 if fd > 0

当断点,断了后执行命令
()command 12
()silent
()print “fd is %d\n”,fd
()continue
()end

动态ping不修改代码。

tracepoint 远程主机通讯调试,前端stub立刻恢复执行,但会记录下来。

catchpoint

执行控制

进入子函数内部。单步 step

汇编 stepi

stepi 4
类似nexti

不要进入子函数

next

继续执行

continue

跑起来直到3号断点命中

until 3
跑起来直到3号断点命中,快捷禁止其他断点。

恢复执行直到函数返回。

finish

调用函数!

gdb 杜撰代码调用函数。
call sum(1,2) …

强制返回

强制main函数 return。
return 1

触发中断

异常或断点进入调试器。
调试器发起中断,让程序中断下来。ctrl+C,app收到中断信号,进入调试器。

符号

调试器读区 调试符号。

二进制-调试符号-源码

linux dwarf 存储调试符号信息。gcc

readelf -h filename
里面如果有line location debug标示

readelf -w 导出调试文件

gcc -g 才能输出符号

ubuntu 符号服务器
< ddebs.ubuntu.com/pool/main/>
分离操作
strip

安装ubunte的linux 内核符号
https://askubuntu.com/questions/197016/how-to-install-a-package-that-contains-ubuntu-kernel-debug-symbols

安装libc符号

dpkg -s /lib/x86_64-linux-gun/libc-2.15.so
dpkg -s libc.so.6
sudo apt-get -c aptproxy.conf install libc6-dbg

libc 调试符号

sudo apt-get install libc6-dbg

符号路径

gdb 使用file 或 symbol-file 加载符号文件
自动搜索 path 路径

(gdb)i share
* 共享库没调试信息

搜索符号
info vaiables regex 类名/函数名/变量名

内存地址与符号互换

info addriess 函数名

info symbol 地址

(gdb) info address main
Symbol “main” is a function at address 0x400547.
(gdb) info symbol 0x400547
main in section .text of /home/gao/code/a

.

info os

查看加载的文件内存位置

info files

列出全局变量

info variable
info va

显示源码

list
list -
dir 源码路径
show dir

常用命令源码

安装系统工具源码和调试

apt-get source coreutils
sudo apt-get install coreutils-dbgsym
gdb /bin/ls
list main
dir ~/src/coreutils-7.4/src
list main

libc

sudo apt-get source libc6-dev
/home/ge/eglibc-2.15

dir 搜索路径 :分割
$cdir 编译路径
cwd 当前工作路径

查看调试目标

观察寄存器
info reg


子函数返回地址
函数参数
局部变量

bt n 观察函数返回地址
frame n 切换栈帧
up n
down n
info frame [address]
info args
info locals

注意,切换栈帧之后可能会发生,本地变量值不准确,因为值存在寄存器中需要小心。

观察内存
print

p /f 表达式 表达式要打印位置
xduotcf

x

x /Nuf
N 打印几个单元
u 每个单元大小 b-1byte w-2byte h-4byte g-8byte

f s字符串i指令格式

x/s 0xfffff81946000 打印字符串

x /32bx arg bit 16禁制

(gdb) x /32bx &i
0x7fffffffc76c: 0x01 0x00 0x00 0x00 0x70 0x05 0x40 0x00
0x7fffffffc774: 0x00 0x00 0x00 0x00 0x40 0xfa 0xa2 0xf7
0x7fffffffc77c: 0xff 0x7f 0x00 0x00 0x58 0xc8 0xff 0xff
0x7fffffffc784: 0xff 0x7f 0x00 0x00 0x58 0xc8 0xff 0xff
(gdb)

p arg[0]
p arg[i]

p *&a[0]@10 a0数组开始的10个元素

反汇编

disas main main反汇编代码
x/5i schedule 这个地址开始的5条汇编指令。

gdb mov 从左往右赋值at&t汇编。

高级技巧

信号

  • info signals 异常/同步/中断

stop 要不要中断下来看
printf 打印信息
pass 要不要传递给应用程序。

  • handle 修改规则 handle signal act print noprint stop nostop pass nopass

handle SIGPIPE 不要中断下来,打印一个信息,网络程序常用

(gdb) handle SIGPIPE nostop
Signal Stop Print Pass to program Description
SIGPIPE No Yes Yes Broken pipe

Thread

info threads

LWP-light weight process 线程编号。
* gdb当前线程

切换当前线程

thread 2

打印所有线程

thread apply all bt 针对一群线程的命令避免切换来看。

线程改名字

thread name [name]

我自己经验 LWP 可以很好的观察线程负载情况。

posted @ 2017-05-24 14:18 小高 阅读(293) | 评论 (0)编辑 收藏
     摘要: 绘图控件重绘->其他操作->绘图控件重绘

进入了这样一个死循环,函数堆栈空间分配不足够.  阅读全文
posted @ 2017-04-18 10:32 小高 阅读(148) | 评论 (0)编辑 收藏
eclipse 配置遇到 object 找不到问题 ?
The type java.lang.object cannot be resolved - Eclipse buildpath not working

因为替换了 jvm版本.
解决办法: 
build->library -> add library->add jre library.


tomcat部署问题.?
1.清理 部署 重启.  
2.先删掉部署项目,可以重新配置config.

tomcat 找不到oracle 驱动程序?
Tomcat error: java.sql.SQLException: No suitable driver found for jdbc
catalina_home/lib 中已经放入了jar文件后还是报错.
请在 context.xml 中配置
 <WatchedResource>WEB-INF/web.xml</WatchedResource>
 <ResourceLink global="jdbc/oracle" name="jdbc/oracle" type="javax.sql.DataSource"/>
 
在 server.xml

       <Resource
        name="jdbc/oracle"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@10.243.140.111:1521:test"
        username="core"
        password="core"/>

eclipse 项目属性, web deployment assembly设置   source: /webcontent   deploypath: / 


    
tomcat 开启gzip压缩
http://blog.csdn.net/hbcui1984/article/details/5666327



Setting property 'source' to 'org.eclipse.jst.jee.server 这个不是问题.

解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题.
http://blog.csdn.net/foreversilent/article/details/11147847

posted @ 2017-03-09 10:02 小高 阅读(175) | 评论 (1)编辑 收藏
     摘要:   阅读全文
posted @ 2016-12-15 09:34 小高 阅读(472) | 评论 (0)编辑 收藏
     摘要: qt ubuntu 安装和中文  阅读全文
posted @ 2016-12-01 16:30 小高 阅读(311) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2016-05-13 15:59 小高 阅读(222) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2015-12-27 17:07 小高 阅读(472) | 评论 (0)编辑 收藏

导航

<2015年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

常用链接

留言簿(3)

随笔分类(352)

收藏夹(19)

关注的blog

手册

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜