应用程序正在生成核心文件。
这是核心信息。
错误堆栈已获得,目标是检查 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代码:
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) 根据不同的线程,我了解到对数组使用'&'不会返回双指针而是指针数组.
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) 在查看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)
如何确定值是从左向右处理还是从右处理?
以下示例定义了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 …
从大会领域开始,很难找到一个像样的教程.想找一本"傻瓜大会"一书.
我遇到了以下内容,并且'test'命令始终使用相同的地址或注册表运行.
0x08048e14 <+21>: test %esi,%esi
0x08048e16 <+23>: jne 0x8048e4b <main+76>
Run Code Online (Sandbox Code Playgroud)
由于相同的注册表或地址是AND,何时不会返回,这些是相同的?