我想知道哪一个负责清理堆栈
假设你有一个功能乐趣,让我们这样说:
var = fun(int x, int y, float z, char x);
何时fun被调用它将与参数一起进入堆栈然后当函数返回负责清理堆栈的人是它自己的函数还是将保存返回值的"var".
还有一件事,任何人都可以解释调用约定的概念吗?
假设有methodA(),methodB()和methodC().
并且在运行时调用methodC().
有可能知道从哪个方法调用methodC()?
我在想是否可以在运行时读取CallStack以进行某些检查?如果是,我认为这应该不是什么大问题.
有任何想法吗?
谢谢!
我只能想象1)参数; 2)局部变量;
还有什么?
1)功能返回地址?2)功能名称?
这种特定方法导致应用程序中断:
# needed becasuse of a rails bug
def to_s
  "#{self.class.name.underscore}__#{object_id}"
end  
出现以下错误:
ActionView::TemplateError (`@content_for_details_view_builder__2234321380' is not allowed as an instance variable name) in app/views/shared/_details_view.haml:
基本上这是导致上述异常的代码执行:
# controller
def new
  @view_mode = :new
  template = "new"
  render template, :layout => false
end    
# new.haml
- details_view @user do |b, f|
# build_helper
def details_view(model, options = {}, &block)
  # instantiate OptionsWrapper passing a hash of key/value pairs, in this case
  # an empty hash. OptionsWrapper contains a method_missing method so …我目前正在学习x86汇编与"Linux中的汇编语言指南"和第241页,写道只有16位字或32位字保存到堆栈中,但这是真的吗?我的意思是在C中,一个char数组由单个字节组成,它们被保存到堆栈中,因为C由使用调用堆栈的函数组成,对吧?那我错了什么?
我有一个程序,使用执行非常快节奏的Lua脚本调用lua_pcall.似乎程序调用lua脚本的速度太快,事情会崩溃并导致在最随机的地方发生访问冲突.
我尝试过互斥锁,甚至用try/catch启用SEH异常也无济于事.错误功能到位,我正在检查所有适当的返回代码; 问题是pcall内部的实际访问冲突,而不是安全处理的Lua错误.
很多时候中断发生luaV_execute,但有时它在其他随机的地方.我已经检查过以确保推送到堆栈的所有参数都有效.
有没有办法强制Lua在返回之前完成一个调用,或者某种方式确保调用堆栈不会被破坏?
我开始使用WinDbg来调试VB6运行时错误,但无法让它真正起作用,我只需要知道错误的来源(错误来自的过程).
我创建了一个小应用程序来测试并使它抛出溢出运行时错误,如下所示:
Private Sub Command1_Click()
    Dim a As Byte
    a = 1000
End Sub
我通过选中"创建符号调试信息"选项编译它以创建PDB文件.
然后我将应用程序附加到WinDbg并单击按钮以抛出错误,但是当我检查调用堆栈时,我没有找到任何Command1_Click程序的跟踪.我得到的是以下内容:
0:001> ~* k
   0  Id: 56c.173c Suspend: 1 Teb: 7ffde000 Unfrozen
ChildEBP RetAddr  
0012ea08 7e419418 ntdll!KiFastSystemCallRet
0012ea40 7e4249c4 USER32!NtUserWaitMessage+0xc
0012ea68 7e43a956 USER32!InternalDialogBox+0xd0
0012ed28 7e43a2bc USER32!SoftModalMessageBox+0x938
0012ee78 7e43a10b USER32!MessageBoxWorker+0x2ba
0012eee4 729af829 USER32!MessageBoxIndirectA+0xb8
WARNING: Stack unwind information not available. Following frames may be wrong.
0012ef24 729af6a5 MSVBVM60!IID_IVbaHost+0x411e9
0012ef4c 729af9a0 MSVBVM60!IID_IVbaHost+0x41065
0012ef7c 729a3d68 MSVBVM60!IID_IVbaHost+0x41360
0012efe0 729a3db6 MSVBVM60!IID_IVbaHost+0x35728
0012f000 72a0c411 MSVBVM60!IID_IVbaHost+0x35776
0012f01c 72a0c6f3 MSVBVM60!_vbaOnGoCheck+0xba
0012f05c 7c9032a8 …我想编写一个调用自身和其他函数的函数(在hlasm中).
在x86或z80(可能还有其他)上,您只需调用函数,并在其结尾处进行返回.然后处理器将存储和检索返回地址.
指令集有以下指令:BAL reg,func ...将寄存器中的寄存器地址存储在寄存器中,最后你可以将BR寄存器跳转到该寄存器地址.另一个问题是显然没有推/弹指令.
所以我现在有点st ..
问候
我正在通过反汇编gdb输出分析核心验尸。我对此并不陌生,所以我对自己正在看的东西的理解仍在不断增长。对我来说,一个直接的困惑是,当我在不同的帧之间浏览并查看反汇编输出时,我看不到callq命令正在运行,正如我对所有非帧0帧所期望的那样。导致第0帧的每个帧都不应该调用函数吗?
(gdb) f 0
(gdb) disassemble
...
=> 0x0000000001b0af10 <+16>:    mov    (%rdi),%rdx
...
End of assembler dump.
(gdb) info registers rdi
rdi            0x0      0
很有道理:崩溃是由于ptr取消引用无效而发生的。现在,让我们一举成名,然后在此处查看反汇编输出:
(gdb) up
(gdb) disassemble
...
=> 0x0000000001b1c01b <+315>:   test   %al,%al
...
什么?上面的框架正在运行测试?它不应该调用在第0帧中反汇编的函数吗?我有什么误会?
这是从GCC 4.8编译C ++代码生成的x64程序集。