我为一个核心设置了一个gdb会话,它表明在读取一个指针的成员时,指针的取消引用中存在一个分段错误。指针的值为非空。我假设这意味着进程无法访问内存地址。如何从核心的死后gdb会话中获取这些信息?
例如,给定以下程序:
#include <iostream>
using namespace std;
int
main(int argc, char* argv[])
{
int *ptr = new int(5);
cout << "I can access it here: " << *ptr << endl;
因此,在这个简单的程序中,我只是尝试用gdb访问eax。
C代码:
int main(){
int a = 1;
int b = 3;
int c = a + b;
return 1;
}
下面是我的gdb尝试:
(gdb) disas
Dump of assembler code for function main:
0x000000000040049c <+0>: push %rbp
0x000000000040049d <+1>: mov %rsp,%rbp
0x00000000004004a0 <+4>:
我有一个物理内存转储文件和一个符号文件(vmlinux),我想用gdb中的符号文件来分析转储文件的内容。例如,要查看物理内存转储时init_task的状态:
(gdb) print &init_task
=> show the address of init_task in physical memory dump file, said 0xc0XXXXXX
(gdb) print ((struct task_struct *) 0xc0XXXXXX)->tasks
=> show the content of init_task.tasks in physical
根据
mov 0xffffffb4,0x1
将数字1移动到0 number 4。
所以,我决定自己测试这个。在GDB中,x是打印内存地址值的命令。但是,当我跑的时候
x 0x00000000004004fc
我没有得到133 (十进制)或85 (十六进制)的值
相反,我得到了0x85f445c7。知道这是什么吗?
me@box:~/c$ gdb -q test
Reading symbols from test...done.
(gdb) l
1 #include <stdio.h>
2
3 int main(){
4 i
在调试U-boot端口时,我正在尝试弄清楚发生了什么。我已经将U-boot加载到我的主板上,并通过BDI2000设置进行调试。当我单步执行start.S时,我总是遇到这个错误:
(gdb) si
314 mtspr SPRN_SRR0,r0
(gdb) si
315 mtspr SPRN_SRR1,r0
(gdb) si
316 mtspr SPRN_CSRR0,r0
(gdb) si
317 mtspr SPRN_CSRR1,r0
(gdb) si
320 mtspr SPRN_MCSRR0,r0
(gdb) si
321
这是我的C代码
λ gdb var -q
Reading symbols from C:\Codes\var.exe...done.
(gdb) set disassembly-flavor intel
(gdb) list
1 #include<stdio.h>
2
3 int main()
4 {
5 int a = 9;
6 int b = 10;
7 int c = 11;
8 return 0;
9 }
(gdb)
这是装配的主要功能。
(gdb
(gdb) break main
Breakpoint 1 at 0x80483e4: file hello.c, line 6.
(gdb) run
Starting program: /PROG/1/a.out
Breakpoint 1, main () at hello.c:6
6 for(i=0;i<10;i++)
(gdb) disassemble main
Dump of assembler code for function main:
0x080483d4 <+0>: push ebp
0x080483d5 <+
让我们只关注Rect_IsEmpty()函数。
nm命令提供了以下输出:
(...)
00021af0 T Rect_IsEmpty
(...)
另一方面,当我启动gdb并看到这个函数的地址时,我得到:
(gdb) info address Rect_IsEmpty
Symbol "Rect_IsEmpty" is at 0x8057c84 in a file compiled without debugging.
有谁能解释一下为什么这些地址不一样?gdb从哪里得到这个地址?
我目前正在做gdb反汇编工作,以帮助我理解更多关于c程序的细节,所以我写了一个c程序:
#include <stdio.h>
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
void main(){
int a = 1,b = 2;
swap(a, b);
}
我使用gdb并运行disass /m main来获取这些:
(gdb) disass /m main
Dump of assembler code for function m
我有以下代码:
struct A
{
int fieldA;
int fieldB;
};
A *a = (A *) ptr;
cout << a->fieldA; // Works fine
cout << a->fieldB; // Works fine
ptr是指向内存中某个位置的char *对象。存储在地址ptr的内存中的对象是A对象。该结构由内存中的另一个进程编写,该进程在进程之间共享。在我有上述代码的过程中,共享内存是只读的。
在远程目标上执行的程序。我使用gdb-server在目标上运行程序,并使用gdb从我的开发机器连接到服务器。