- 论坛徽章:
- 0
|
BT的问题。遇到过几次。可能有简单的解决方法,可惜不知道。谁知道的,thanks very much to share: mail to liuake _at_ gmail.com
一个项目,有多个module,各module有各自的local global var。假设A module中有局部全局变量g_local。在B module中也有局部全局变量g_local。现在,process core在了A module,怎么样查看B module中g_local的值?测试代码如下。
/*********************************
* filename : fa.c
* ------------------------------
* function :
* module A, g_local = 12 when core ********************************/
#include
static int g_local; /* global varible, but local */
int fa2(void)
{
int a;
int *pn = NULL;
a = 12;
g_local = a;
*pn = 0; /* core here */
return a;
}
int fa1(void)
{
int a;
a = 11;
fa2();
g_local = a;
return a;
}
int fa(void)
{
int a;
a = 10;
fa1();
g_local = a;
return a;
}
/*********************************
* filename : fb.c
* ------------------------------
* function :
* module b, g_local = 10 finally ********************************/
#include
static int g_local; /* local global */
int fb3(void)
{
int b;
b = 13;
g_local = b;
return b;
}
int fb2(void)
{
int b;
b = 12;
fb3();
g_local = b;
return b;
}
int fb1(void)
{
int b;
b = 11;
fb2();
g_local = b;
return b;
}
int fb(void)
{
int b;
b = 10;
fb1();
g_local = b;
return b;
}
/*********************************
* filename : elf.c
* ------------------------------
* function :
* Just for testing
********************************/
#include
extern int fa(void);
extern int fb(void);
int main(void)
{
fb();
fa();
return 0;
}
以下是调试过程:
$gcc -o elf fa.c fb.c elf.c
$ulimit -c 99999
$./elf
Segmentation fault (core dumped)
$gdb elf core.xxxxx
(gdb) bt
#0 0x08048313 in fa2 () at fa.c:18
#1 0x08048330 in fa1 () at fa.c:26
#2 0x0804834f in fa () at fa.c:35
#3 0x080483ee in main () at elf.c:17
(gdb) p g_local
$1 = 12 /* it is the value of module A, how to print g_local of fb.c??*/
无计可施。只有用BT的方法了。
$ readelf -a elf > map.txt /* dump elf address mapping information */
$ vi map.txt
83: 00000000 0 FILE LOCAL DEFAULT ABS fa.c
84: 080495a8 4 OBJECT LOCAL DEFAULT 22 g_local
85: 00000000 0 FILE LOCAL DEFAULT ABS fb.c
86: 080495ac 4 OBJECT LOCAL DEFAULT 22 g_local
找到了 fb.c 中 g_local的address,再回到gdb.
(gdb) p *(int *)0x080495ac
$1 = 10
这下对了。正是B中g_local的值。OK,搞定这个BT问题。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/28158/showart_217998.html |
|