小编Unh*_*ion的帖子

核心文件内存分析验证

应用程序正在生成核心文件。

这是核心信息。

错误堆栈已获得,目标是检查 myStruct 变量中的数据内容,因为这是核心发生时传递给 myFunction 的内容。

(gdb) where
#0  0x000000000041bba1 in myFunction (myStruct=0x7ffff9dd0c20) at myTest.c:344
        :
        :
        :
Run Code Online (Sandbox Code Playgroud)

从上面我得到了myStruct在0x7ffff9dd0c20的地址并转储了200个字。

(gdb) x/200x 0x7ffff9dd0c20
0x7ffff9dd0c20: 0x01938640      0x00000000      0x00001c34      0x000002c8
0x7ffff9dd0c30: 0x00000400      0x00000000      0x01939760      0x00000000
0x7ffff9dd0c40: 0x00000014      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c50: 0x00000000      0x0005000c      0x00000000      0x000d0000
0x7ffff9dd0c60: 0x00000004      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c70: 0x00000000      0x00000000      0x00040000      0x00000000
0x7ffff9dd0c80: 0x0001000c      0x00000000      0x00000000      0x00000000
0x7ffff9dd0c90: 0x00000000      0x00000000      0x00000009      0x00000000
0x7ffff9dd0ca0: 0x00000000      0x00000000      0x410d999a      0x418d999a
0x7ffff9dd0cb0: 0x40b80000      0x41380000      0x000010cc      0x00000000
0x7ffff9dd0cc0: 0x0192edd0      0x00000000      0x00000a30      0x00000158
   :
   : …
Run Code Online (Sandbox Code Playgroud)

c gdb coredump

6
推荐指数
1
解决办法
71
查看次数

如何将汇编代码与C程序中的确切行关联?

以下是通过装配网站找到的示例.这是C代码:

 int main()
 {
     int a = 5;
     int b = a + 6;
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

这是相关的汇编代码:

    (gdb) disassemble
    Dump of assembler code for function main:
    0x0000000100000f50 <main+0>:    push   %rbp
    0x0000000100000f51 <main+1>:    mov    %rsp,%rbp
    0x0000000100000f54 <main+4>:    mov    $0x0,%eax
    0x0000000100000f59 <main+9>:    movl   $0x0,-0x4(%rbp)
    0x0000000100000f60 <main+16>:   movl   $0x5,-0x8(%rbp)
    0x0000000100000f67 <main+23>:   mov    -0x8(%rbp),%ecx
    0x0000000100000f6a <main+26>:   add    $0x6,%ecx
    0x0000000100000f70 <main+32>:   mov    %ecx,-0xc(%rbp)
    0x0000000100000f73 <main+35>:   pop    %rbp
    0x0000000100000f74 <main+36>:   retq   
    End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

我可以放心地假设这行汇编代码:

  0x0000000100000f6a <main+26>:   add    $0x6,%ecx
Run Code Online (Sandbox Code Playgroud)

与此C行相关:

     int b = a …
Run Code Online (Sandbox Code Playgroud)

c debugging assembly gdb

5
推荐指数
2
解决办法
1731
查看次数

数组指针未返回预期值

根据不同的线程,我了解到对数组使用'&'不会返回双指针而是指针数组.

int x[9] = {11, 22,33,44,55,66,77,88,99};
int (*xpt)[9] = &x;    <---This is the focus of this thread.
Run Code Online (Sandbox Code Playgroud)

以下代码编译并执行.

#include <stdio.h>
int main () 
{
    int x[9] = {11, 22,33,44,55,66,77,88,99};
    int (*xpt)[9] = &x;

    printf("xpt[0] = %d\n", xpt[0]);
    printf("xpt[0][0] = %d\n", xpt[0][0]);
    printf("xpt[0][1] = %d\n", xpt[0][1]);
    printf("*xpt[0] = %d\n", *xpt[0]);
    printf("*xpt[1] = %d\n", *xpt[1]);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出.

> ./runThis
xpt[0] = 155709776
xpt[0][0] = 11
xpt[0][1] = 22
*xpt[0] = 11
*xpt[1] = 32766
Run Code Online (Sandbox Code Playgroud)

问题与输出有关.由于xpt是一个数组指针(我假设),xpt [0]只是显示第一个值11的地址.

以下两行有效,我有点惊讶.

  xpt[0][0] …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers

3
推荐指数
1
解决办法
102
查看次数

如何确定寄存器是从右到左加载,反之亦然

在查看gdb输出并查看汇编调用时,通常我可以找到一个使用硬编码值的命令来确定寄存器是从右到左加载,反之亦然.

通常类似于以下内容:

  sub     rsp, 16
Run Code Online (Sandbox Code Playgroud)

要么

  sub     16, rsp 
Run Code Online (Sandbox Code Playgroud)

但有时候,没有像上面这样的值可见.我所看到的只是如下调用:

(gdb) disassemble
 Dump of assembler code for function main:
 0x0000000100000f54 <main+4>:    mov    $rdi,%r15
 0x0000000100000f59 <main+9>:    mov    $rsi,%r14
 0x0000000100000f60 <main+16>:   mov    $rdx,%r13
 0x0000000100000f67 <main+23>:   mov    $ecx,$r12d
 End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

如何确定值是从左向右处理还是从右处理?

x86 assembly cpu-registers att intel-syntax

2
推荐指数
1
解决办法
290
查看次数

Java:为什么放置静态变量很重要?

以下示例定义了2个静态变量。变量1(myBoolean1)在MySingletonExample(实例)变量上方定义。

变量2(myBoolean2)在MySingletonExample(实例)变量下定义。

两个变量都设置为true,但是只有1个变量(myBoolean1)在显示时显示正确的值。

public class MySingletonExample 
{

    //static volatile boolean  myBoolean1 = false;
    static boolean  myBoolean1 = false;

    private static volatile MySingletonExample instance = new MySingletonExample();

    //static volatile boolean  myBoolean2 = false;
    static boolean  myBoolean2 = false;


    private MySingletonExample()
    {
        myBoolean1 = true;
        myBoolean2 = true;
    }

    protected static MySingletonExample getInstance() 
    {
        System.out.println("myBoolean1 = " + myBoolean1);
        System.out.println("myBoolean2 = " + myBoolean2);
        return instance;
    }


    public static void main(String[] args)
    {
        MySingletonExample.getInstance();
        System.out.println("---------------------------");
        MySingletonExample.getInstance();
    }

}
Run Code Online (Sandbox Code Playgroud)

执行时,这是输出。

myBoolean1 …

java static

1
推荐指数
2
解决办法
108
查看次数

汇编:什么时候会测试%esi,%esi返回不相等?

从大会领域开始,很难找到一个像样的教程.想找一本"傻瓜大会"一书.

我遇到了以下内容,并且'test'命令始终使用相同的地址或注册表运行.

0x08048e14 <+21>:   test   %esi,%esi
0x08048e16 <+23>:   jne    0x8048e4b <main+76>
Run Code Online (Sandbox Code Playgroud)

由于相同的注册表或地址是AND,何时不会返回,这些是相同的?

x86 assembly

0
推荐指数
1
解决办法
508
查看次数

标签 统计

assembly ×3

c ×3

gdb ×2

x86 ×2

arrays ×1

att ×1

coredump ×1

cpu-registers ×1

debugging ×1

intel-syntax ×1

java ×1

pointers ×1

static ×1