+ -
当前位置:首页 → 问答吧 → 请教,gdb

请教,gdb

时间:2010-07-09

来源:互联网

如何显示core的 语句、指令和寄存器的值?
程序死亡点的。

作者: yulihua49   发布时间: 2010-07-09

回复 yulihua49


   dbx 是这样的 :试下gdb 看看?(猜测大同小异,错了别怪我 呵呵)

  dbx  program_name  core


   where     (就可以看到程序在哪个函数崩溃的,栈的状态都有显示)

作者: llslls_007   发布时间: 2010-07-09

去看gdb的ml上嚷嚷去吧。

作者: prolj   发布时间: 2010-07-09



QUOTE:
回复  yulihua49


   dbx 是这样的 :试下gdb 看看?(猜测大同小异,错了别怪我 呵呵)

  dbx  pr ...
llslls_007 发表于 2010-07-09 10:06




    #0  0x0000000000412568 in n_zero ()
(gdb) where
#0  0x0000000000412568 in n_zero ()
#1  0x000000000041317c in str_a64n ()
#2  0x000000000040ac5f in RecvPack ()
#3  0x000000000040dd2b in thread_work ()
#4  0x00002b4739441143 in start_thread () from /lib64/libpthread.so.0
#5  0x00002b473961174d in clone () from /lib64/libc.so.6
#6  0x0000000000000000 in ?? ()
我想看指令和寄存器,好像应该是print,不知print什么。

作者: yulihua49   发布时间: 2010-07-09

我只知道print 看变量

看指令 和 寄存器 看下汇编代码 满足你的需求吗

作者: llslls_007   发布时间: 2010-07-09



QUOTE:
我只知道print 看变量

看指令 和 寄存器 看下汇编代码 满足你的需求吗
llslls_007 发表于 2010-07-09 10:56




    就是看反汇编。

作者: yulihua49   发布时间: 2010-07-09

回复 yulihua49


gdb
看反汇编
    disas [函数名或地址]
单步不进入
    ni
单步进入
    si
断点
    b [函数名或地址]
运行
    r
断点后继续运行
    c
帮助
    help
详细帮助
    help [上一个help列出的分类]

作者: 没本   发布时间: 2010-07-09

本帖最后由 yulihua49 于 2010-07-09 17:32 编辑


QUOTE:
回复  yulihua49


gdb
看反汇编
    disas [函数名或地址]
单步不进入
    ni
单步进入
    si
...
没本 发表于 2010-07-09 14:15




    谢谢。
看看edi的值?

作者: yulihua49   发布时间: 2010-07-09

info reg
此时reg的值是,堆栈顶层时的寄存器值。一般而言,堆栈最顶层寄存器的值是无效的,需要看堆栈顶层的下一层,此时用up down命令,在堆栈中移动

作者: tblue7   发布时间: 2010-07-09

本帖最后由 yulihua49 于 2010-07-09 18:01 编辑


QUOTE:
info reg
此时reg的值是,堆栈顶层时的寄存器值。一般而言,堆栈最顶层寄存器的值是无效的,需要看堆栈顶层 ...
tblue7 发表于 2010-07-09 17:42




    reg不是死亡时的快照?

(gdb) where
#0  0x0000000000412568 in n_zero ()
#1  0x000000000041317c in str_a64n ()
#2  0x000000000040ac5f in RecvPack ()
#3  0x000000000040dd2b in thread_work ()
#4  0x00002b4739441143 in start_thread () from /lib64/libpthread.so.0
#5  0x00002b473961174d in clone () from /lib64/libc.so.6
#6  0x0000000000000000 in ?? ()
(gdb) disas 0x0000000000412568
Dump of assembler code for function n_zero:
0x0000000000412561 <n_zero+0>:  test   %edi,%edi
0x0000000000412563 <n_zero+2>:  je     0x412577 <n_zero+22>
0x0000000000412565 <n_zero+4>:  mov    %rsi,%rax
0x0000000000412568 <n_zero+7>:  movl   $0x0,(%rax)
0x000000000041256e <n_zero+13>: add    $0x4,%rax
0x0000000000412572 <n_zero+17>: sub    $0x1,%edi
0x0000000000412575 <n_zero+20>: jne    0x412568 <n_zero+7>
0x0000000000412577 <n_zero+22>: mov    %rsi,%rax
0x000000000041257a <n_zero+25>: retq   
End of assembler dump.
(gdb) info reg
rax            0x4      4
rbx            0x2aacbc91d820   46921386416160
rcx            0x2aacbc91f908   46921386424584
rdx            0x4      4
rsi            0x4      4
rdi            0x9      9
rbp            0x4      0x4
rsp            0x2aacbc91d600   0x2aacbc91d600
r8             0x2aacbc91d5c0   46921386415552
r9             0x2aacbc91d4c0   46921386415296
r10            0x2aacbc91d4c0   46921386415296
r11            0x206    518
r12            0x2aacbc91ea90   46921386420880
r13            0xc      12
r14            0x2aacbc91f160   46921386422624
r15            0xaf2a644c       2938790988
rip            0x40ac5f 0x40ac5f <RecvPack+243>
eflags         0x10206  [ PF IF RF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
fctrl          0x37f    895
fstat          0x0      0
ftag           0xffff   65535
fiseg          0x0      0
fioff          0x0      0
foseg          0x0      0
fooff          0x0      0
fop            0x0      0
mxcsr          0x1f80   [ IM DM ZM OM UM PM ]

edi是rdi的一部分?最后的指令是哪条?

看起来指令优化很好,不过还没有用到串指令。

如果用 movsd和jcxz指令就更好。还有;
rep movsd,一条指令顶这一大堆。

作者: yulihua49   发布时间: 2010-07-09

一路up到RecvPack ,然后看出core那句时的变量值。

作者: 没本   发布时间: 2010-07-09

恩,下次直接挂着gdb跑你的程序吧,也享受一把just-in-time debug

作者: 没本   发布时间: 2010-07-09

本帖最后由 yulihua49 于 2010-07-09 18:10 编辑


QUOTE:
一路up到RecvPack ,然后看出core那句时的变量值。
没本 发表于 2010-07-09 17:57


不行的,我还不至于犯这种低级错误。这是成熟的程序,单个连接运行绝无问题,所以跟踪不到的。
这是我把文件数扩到2048,开1500个连接,在大约1200多个线程开始工作时疯了,可能是其他资源问题。
每次错的都不一样,不可再现错误。找不到的话就不找了,反正以后改线程池。

不管怎么up,reg是不变的。

作者: yulihua49   发布时间: 2010-07-09

1,首先配置下系统,让他生成core文件。如果是linux的话(Red Hat,其他我没试过),可以用ulimit命令设置。
2,编译程序的时候加上-g3选项。
3,gdb -g3编译生成的文件名 core文件。
进去以后想做什么做什么就可以啦,这时候就是挂掉时候的状态了。

作者: 聪聪知不道   发布时间: 2010-07-09