Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gdb-获取寄存器的变量名_C++_C_Debugging_Gdb_Cpu Registers - Fatal编程技术网

C++ gdb-获取寄存器的变量名

C++ gdb-获取寄存器的变量名,c++,c,debugging,gdb,cpu-registers,C++,C,Debugging,Gdb,Cpu Registers,在GDB中,info registers或info all registers将显示所有寄存器符号名称及其值 问题: 如何获取存储在该寄存器中的变量名(即源代码)?(或源代码中的行号,或任何东西) 例如: int my_reg = /* something */; float another_reg = /* something else */; ... 然后,info所有寄存器将返回: R0 0x0 0 R1 0xfffbf0 167

在GDB中,
info registers
info all registers
将显示所有寄存器符号名称及其值

问题:

如何获取存储在该寄存器中的变量名(即源代码)?(或源代码中的行号,或任何东西)

例如:

int my_reg = /* something */;
float another_reg = /* something else */;
...
然后,
info所有寄存器将返回:

R0             0x0      0
R1             0xfffbf0 16776176
R2             0x0      0
R3             0x0      0
R4             0x6      6

如何确定哪个寄存器(R0?R2?R4?)与
my_reg

在任何给定的时间点上,可能有一个寄存器、多个寄存器,甚至没有与任何给定的C变量关联的寄存器。你得检查一下拆卸过程,看看是怎么回事

为什么不打印my_reg
来查看值


l*$pc
将列出当前正在执行的指令周围的源代码。

如果您可以访问调试符号(并了解如何读取它们-即,您有一些解析调试符号的代码),则可以准确跟踪哪个寄存器对应于哪个寄存器。然而,这很可能是从一行到下一行的变化,因为编译器出于这样或那样的原因决定移动对象(例如,一些计算从R1开始,最后以R2结束,因为这比试图保留R1中的值要好[或者我们也需要R1中的原始值-想想
array[x++]
-现在我们有了新的
x
,希望是在寄存器中,我们需要用于索引的旧
x
的值也需要在寄存器中,以添加到
数组的基址中

并非所有变量都会在寄存器中结束(取决于处理器和“哪些寄存器可用”)

调试器将知道每个变量在任何给定时间的位置,但有时它可能会非常混乱,例如:

int array[10000];
... 
for(int i = 0; i < 10000; i++)
{
   array[i] = rand();
}
int数组[10000];
... 
对于(int i=0;i<10000;i++)
{
数组[i]=rand();
}
在优化过程中,可能会转化为如下内容:

int array[10000]; 
int *ptr = array;
int *ptr2 = &array[10000];
while(ptr < ptr2)
{
   *ptr++ = rand();
}
int数组[10000];
int*ptr=数组;
int*ptr2=&数组[10000];
而(ptr

现在请尝试打印
i
。)

即使有多个寄存器与一个变量相关联,我仍然想知道何时查看寄存器。我不确定这是一个有意义的操作。难道你不能只查看反汇编并查看一下吗?我实际上是从另一个角度出发的。给定一个寄存器列表,我如何将它们映射到变量上?这是相反的用于确定给定变量的值。但你不能-有些寄存器可能根本与变量无关,有些可能是,有些可能曾经是,但现在只是闲置着。同样,查看生成的代码是获得该上下文的唯一方法。可能调试器就是这样做的。也许有一种方法可以让你不这样做o做同样的事情?见鬼,当试图分析这些信息以获得优化的代码时,即使是调试器也往往做得不好。@MatthewParks:我不是说很难,但是说实话-你为什么在意呢?C Optimizer是为了找到寄存器来加速你的代码。它所做的任何事情都可能会随着新的编译器版本或新版本而改变不同的编译器标志。如果你需要关心这类事情,你可能应该在汇编中编写代码。那么…我如何解析这些调试符号?有一些流行的软件包吗?很难…调试符号是对编译过程中发生的事情的复杂描述。不同的处理器体系结构(默认为)不同的调试格式-这是什么处理器?动机实际上是GPU的-我试图了解寄存器的使用情况,因为每个线程使用过多的寄存器会对GPU性能产生不利影响。CUDA已包装GDB以创建“CUDA GDB”。它与GDB相同,还有一些特性。但这两个(GDB和cuda GDB)中的寄存器命名问题是相同的因此,查看生成的汇编程序输出函数可能比查看调试格式更容易。但从我的角度来看,这只是一个猜测。但由于我不知道CUDA-GDB的调试格式是什么,因此我无法真正说明需要什么样的“解析器”。还要注意,“寄存器用法”与“变量”不同不是所有的寄存器都是变量,也不是所有的变量都是寄存器。如果你像这样做:x=r[i]+g[j]+b[k],编译器会使用2,3,4,5,6,7个寄存器来计算它。当然,围绕这个计算的代码可能已经使用了一些寄存器。这是一个复杂的问题,我想你会认为这是一个相对简单的问题。。。