当前位置: 首页 > 知识库问答 >
问题:

在反汇编代码中跟踪调用堆栈

邹京
2023-03-14

我正在尝试调试一个棘手的核心转储(从一个-O2优化的二进制)。

// Caller Function 
void caller(Container* c)
{
  std::list < Message*> msgs;
  if(!decoder.called(c->buf_, msgs))
  {
   ....
   .....
  }
// Called Function
bool
Decoder::called(Buffer* buf, list < Message*>& msgs)
{
   add_data(buf); // Inlined code to append buf to decoders buf chain
   while(m_data_in && m_data_in->length() > 0)
   {
     .....
   }
}
push   %r15
mov    %rdi,%r15
push   %r14
push   %r13
push   %r12
push   %rbp
push   %rbx
sub    $0x68,%rsp
test   %rsi,%rsi
je     0x8ccd62 
cmpq   $0x0,(%rsi)
je     0x8ccd62 
lea    0x40(%rsp),%rax
lea    0x1b8(%rdi),%rdi
mov    %rax,(%rsp)
mov    %rax,0x40(%rsp)
mov    %rax,%rdx
mov    %rax,0x48(%rsp)
mov    (%rsi),%rsi
callq  0x8cc820 
rax            0x7fbfffc7e0 548682057696
rbx            0x2a97905ba0 182931446688
rcx            0x0  0
rdx            0x2  2
rsi            0x1  1
rdi            0x7fbfffc7e2 548682057698
rbp            0x4f 0x4f
rsp            0x7fbfffc870 0x7fbfffc870
r8             0x40 64
r9             0x20 32
r10            0x7fbfffc7e0 548682057696
r11            0x2abe466600 183580911104
r12            0x7fbfffd910 548682062096 // THIS IS HOLDING buf_
r13            0x7fbfffdec0 548682063552
r14            0x5dc    1500
r15            0x2a97905ba0 182931446688
rip            0x8cca89 0x8cca89 
eflags         0x206    [ PF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0
push   %r14
push   %r13
mov    %rdx,%r13
push   %r12
mov    %rdi,%r12
push   %rbp
push   %rbx
sub    $0x10,%rsp
mov    0x8(%rdi),%rdx
test   %rdx,%rdx
jne    0x8cc843 
jmpq   0x8cc9cb 
mov    %rax,%rdx
mov    0x8(%rdx),%rax
test   %rax,%rax
mov    %rsi,0x8(%rdx)
mov    0x8(%r12),%rax
test   %rax,%rax
xor    %edx,%edx
add    0x4(%rax),%edx
mov    0x8(%rax),%rax
lea    0x8(%rsp),%rsi
mov    %r12,%rdi
movq   $0x0,0x8(%rsp)

被调用函数寄存器信息
:

rax            0x7fbfffc7e0     548682057696
rbx            0x2abc49f9c0     183547591104
rcx            0x0      0
rdx            0x2      2
rsi            0x1      1
rdi            0x7fbfffc7e2     548682057698
rbp            0xffffffff       0xffffffff
rsp            0x7fbfffc830     0x7fbfffc830
r8             0x40     64
r9             0x20     32
r10            0x7fbfffc7e0     548682057696
r11            0x2abe466600     183580911104
r12            0x2a97905d58     182931447128
r13            0x7fbfffc8b0     548682057904
r14            0x5dc    1500
r15            0x2a97905ba0     182931446688
rip            0x8cc88a 0x8cc88a 
eflags         0x206    [ PF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0


问题是,在被调用的函数中,“add_data”函数似乎没有实现任何功能。因此,我们想知道在被调用函数的反汇编中,是否看到“buf_”指针被任何地方使用(被调用函数中的寄存器r12)。

我确实在一定程度上了解程序集,但所有这些代码内联让我感到困惑。
希望在取消被调用的函数反汇编方面得到一些帮助。

update:
add_data在下面执行以下操作:


if (m_data_in) {
    m_data_in->next = data;
} else {
    m_data_in = data;
}

共有1个答案

弓玉书
2023-03-14

这看起来像if(m_data_in)

mov    0x8(%rdi),%rdx
test   %rdx,%rdx
test   %rdx,%rdx
jne    0x8cc843 
jmpq   0x8cc9cb 

现在,我不太清楚0x8CC8430x8CC9CB在您的代码中的位置,因此无法进一步了解代码。仍然没有足够的代码和信息来确切地说出原始问题中正在发生的事情。如果提供更多的信息,我很乐意填写更多的答案。

 类似资料:
  • 问题内容: 当我从标准库中获得运行时异常时,这几乎总是我的代码而不是库代码中的问题。有没有一种方法可以截断异常堆栈跟踪,以使其不显示库包的内容? 例如,我想得到这个: 而不是这样: 问题答案: 感谢Alex的指导,以下是代码: 产生以下堆栈跟踪:

  • 问题内容: 在这里,我有点茫然。我一直在看到这些中的数量稳定增长。我怀疑随着Droid所有者2.2升级的增加而增加的共谋杀人事件,尽管这只是一个猜测。我自己从未见过崩溃,而且市场提供的堆栈跟踪没有提及我编写的任何类。因此,我不知道从哪里开始解决问题。 因为我不知道原因,所以我也不知道要提供什么信息来帮助诊断,所以我给大家一个概括:我的应用程序是WootWatcher。它跟踪Woot.com并将新的

  • 问题内容: 我最近发现了一个导致NullPointerException的错误。使用标准slf4j语句捕获并记录该异常。下面的节略代码: 如您所见,没有任何幻想。但是,在我们拥有的所有异常日志记录语句中,仅此一条不会打印堆栈跟踪。它仅打印消息(表示为“ …”)和异常类的名称(java.lang.NullPointerException)。 由于对异常的堆栈跟踪是延迟加载的,因此我认为可能存在某种指

  • 我试图在Google Play Store中调试我的应用程序的几个崩溃,但是Play Store中显示的堆栈跟踪显示的是Java文件名和行号,而不是直接引用我的Kotlin代码。我在Android Studio中查看了Java代码,但是行号不匹配。 为了查看Java代码,我转换成字节代码,然后反编译成Java。在Android Studio中还有一个更直接的选项“将Kotlin反编译为Java”,

  • 当Xdebug被激活时,只要PHP决定显示通知,警告,错误等,就会显示堆栈跟踪。堆栈跟踪显示的信息以及显示方式可以根据您的需要进行配置。 Xdebug在错误情况下显示的堆栈跟踪信息量相当保守(如果display.errors 在php.ini中设置为On)。这是因为大量的信息会减慢脚本的执行速度和浏览器中堆栈跟踪本身的渲染速度。但是,可以使堆栈轨迹以不同的设置显示更详细的信息。 堆栈跟踪中的变量

  • 有人知道如何在Android Studio中调试吗? 由于出现异常,我的程序无法运行, 它说使用< code>debug或stacktrace获取更多信息。请帮助我。所有其他应用程序运行良好,只有当前项目有这个错误。