假设我有'numb'=1025 [00000000 00000000 00000100 00000001]代表的数字:
在Little-Endian机器上:
00000001 00000100 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
在Big-Endian机器上:
00000000 00000000 00000100 00000001
Run Code Online (Sandbox Code Playgroud)
现在,如果我在10位上应用Left Shift(即:numb << = 10),我应该:
[A]在Little-Endian机器上:
正如我在GDB中注意到的那样,Little Endian通过3个步骤执行左移:[我已经显示'3'步骤以更好地理解处理]
对待没有.在Big-Endian公约中:
00000000 00000000 00000100 00000001
Run Code Online (Sandbox Code Playgroud)应用左移:
00000000 00010000 00000100 00000000
Run Code Online (Sandbox Code Playgroud)再次在Little-Endian中表示结果:
00000000 00000100 00010000 00000000
Run Code Online (Sandbox Code Playgroud)[B].在Big-Endian机器上:
00000000 00010000 00000100 00000000
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如果我直接在Little Endian公约上应用左移,它应该给:
numb:
00000001 00000100 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
numb << 10:
00010000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
但实际上,它给出了:
00000000 00000100 00010000 00000000
Run Code Online (Sandbox Code Playgroud)
为了达到第二个结果,我在上面展示了三个假设步骤.
请解释一下为什么上述两个结果不同:实际结果numb << 10与预期结果不同.
我需要为kgdb-gdb远程连接创建串口套接字.
就像mkfifo在系统上创建FIFO一样,我们如何创建套接字文件?
假设我已经为函数中的某个指针分配了内存foo:
void foo()
{
// ...
int *ptr = malloc(20*sizeof(int));
bar (ptr);
}
Run Code Online (Sandbox Code Playgroud)
从foo(),我将这个指针传递给另一个函数bar(),让我们说bar().
现在,在某个时间点,我想检查:指针分配了多少内存.
有没有可能的方法,没有搜索声明:
int *ptr = malloc(20*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
使用GDB计算出为指针分配了多少内存?
谢谢.
假设我有这个代码:
int main() {
int var1;
char *ptr = malloc(5 * sizeof(char));
//...........
do_something();
//...........
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们知道,实际的内存布局将分为领域,如:.text,.bss,.data,.heap,.stack.
我知道如何使用objdump,readelf等等.但是,我希望更好地了解内存堆栈,我可以看到以下内容:
.heap ptr
.stack do_something()
.text main()
.bss var1
Run Code Online (Sandbox Code Playgroud)
主要的一点是:实际变量名是从输出丢失objdump,readelf等等.
我正在编译此代码-g,从而保留符号表.
那么,为什么我无法看到包含本地/全局变量名的内存布局?
objdump -x如果static不是类型,则显示变量的名称.为什么?
假设我的程序是:
typedef int MYINT;
int main()
{
MYINT x = 5;
........
do_something()
........
/* I wanna test whether MYINT is defined or not */
/* I can't use: ifdef (MYINT), since MYINT is not a macro */
........
return 0;
}
Run Code Online (Sandbox Code Playgroud)
实际上,我在使用vxworks的交叉编译器时遇到了这个问题.交叉编译头文件包括:typedef int INT.
但是,我的堆栈头文件使用:
#ifndef INT
#define int INT
Run Code Online (Sandbox Code Playgroud)
您能否建议如何测试typedef,无论它们是否先前已定义过?
提前致谢.
我正在从遗留代码中删除gcc警告.
是否可以通过类型转换来抑制警告"从不同大小的整数转换为指针":
example:
some_struct *ptr = func() // func() returns an integer.
Run Code Online (Sandbox Code Playgroud)
有人可以指导我如何解决这样的gcc警告?
请考虑以下代码:
#include <stdio.h>
#include <stdlib.h>
#define NUM_ARRAYS 4
#define NUM_ELEMENTS 4
#define INVALID_VAL -1
int main()
{
int index = INVALID_VAL;
int array_index = INVALID_VAL;
int **ptr = NULL;
ptr = malloc(sizeof(int*)*NUM_ARRAYS);
if (!ptr)
{
printf ("\nMemory Allocation Failure !\n\n");
exit (EXIT_FAILURE);
}
for (index=0; index<NUM_ARRAYS; index++)
{
*(ptr+index) = malloc(sizeof(int)*NUM_ELEMENTS);
if (!*(ptr+index))
{
printf ("\nMemory Allocation Failure !\n");
exit (EXIT_FAILURE);
}
}
/* Fill Elements Into This 2-D Array */
for (index=0; index<NUM_ARRAYS; index++)
{
for (array_index = 0; …Run Code Online (Sandbox Code Playgroud) 我用-g选项编译了我的freebsd libc源代码,现在我可以介入libc函数了.
但我无法进入系统调用代码.我用-g编译了freebsd内核源代码.在设置断点时,gdb会在.S文件上通知断点.在点击断点时,gdb无法进入系统调用源代码.
另外,我试过:gdb $ catch系统调用打开
但这也行不通.
你能建议一下吗?
谢谢.
我是否可以查看行号和文件名(对于我使用ltrace/strace运行的程序)以及库调用/系统调用信息.
例如:
code section :: ptr = malloc(sizeof(int)*5); (file:code.c, line:21)
Run Code Online (Sandbox Code Playgroud)
ltrace或任何其他工具: malloc(20) :: code.c::21
我已经尝试了ltrace/strace的所有选项,但无法找到获取此信息的方法.
如果不能通过ltrace/strace实现,我们是否有GNU/Linux的任何并行工具选项?
请考虑以下代码:
main()
{
....
retval = func();
}
Run Code Online (Sandbox Code Playgroud)
假设我在给定函数上放置了一个断点:
gdb$ b func
Run Code Online (Sandbox Code Playgroud)
现在,这个断点被击中并且我在函数 func() 中“完成”:
gdb$ fin
Run Code Online (Sandbox Code Playgroud)
我的问题是:
执行“完成”让我回到 main(),在这里:
retval = func();
Run Code Online (Sandbox Code Playgroud)
我想在 func() 的末尾停止而不退出 func()。
有人可以建议一些通用方法(独立于 func() 中的代码行数)来实现这一目标吗?
谢谢。