标签: callstack

当我从内联汇编中调用它们时,如何将参数传递给C++函数

所以,我希望能够从c ++ dll调用函数.出于某些原因,我想从我的C++代码中的__asm块中调用它们.我的问题是:我知道在调用函数之前,我必须按照函数调用约定指定的顺序在堆栈上推送它的参数.但是,我可以简单地做这样的事情:

int a=5;   
double b = 5.0;  
__asm{  
       push b 
       push a  
       call functionAddress  
}
Run Code Online (Sandbox Code Playgroud)

令我担心的是,我似乎记得汇编中的标准字大小是2字节,而C++中int的大小通常是4bytes,而double是8字节.所以,在上面的例子中,我真的推送每个变量的全部值,或只是前几个字节?如果上面的代码不正确,那么正确的方法是什么?另外,如果我们调用的函数返回一个double,那么这个值存储在哪里?我假设它不能在寄存器中,因为它只能存储32位(4字节).对这个混乱的任何帮助将非常感激:)

x86 callstack inline-assembly argument-passing

8
推荐指数
1
解决办法
3813
查看次数

为什么我的程序在堆栈上限为10MB时分配11MB字符串数组时不会溢出堆栈?

我有两个简单的C++程序和两个问题.我在CentOS 5.2工作,我的开发环境如下:

  • g ++(GCC)4.1.2 20080704(Red Hat 4.1.2-50)
  • "ulimit -s"输出:10240(千字节),即10MB

计划#1:

main.cpp中:

int main(int argc, char * argv[])
{
    char buf[1024*1024*11] = {0};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(用"g ++ -g main.cpp"编译)

程序在堆栈上分配1024*1024*11字节(即11MB),但不会崩溃.将分配大小更改为1024*1024*12(即12MB)后,程序崩溃.我认为这应该是由堆栈溢出引起的. 但是为什么程序在分配大小为11MB时不会崩溃,这也大于10MB的上限?

计划#2:

main.cpp中:

#include <iostream>

int main(int argc, char * argv[])
{
    char buf[1024*1024*11] = {0};

    std::cout << "*** separation ***" << std::endl;

    char buf2[1024*1024] = {0};

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(用"g ++ -g main.cpp"编译)

该程序将导致程序崩溃,因为它在堆栈上分配12MB字节.但是,根据核心转储文件(见下文),崩溃发生在buf但不是buf2. 不应该崩溃发生在buf2上,因为我们从程序#1知道char buf [1024*1024*11]的分配是正常的,因此在我们分配另一个1024*1024字节后,堆栈会溢出吗?

我认为必须有一些非常基本的概念,我没有建立一个坚实的理解.但是他们是什么?

附录:程序#2生成的核心转储信息:

Core was generated by `./a.out'.
Program terminated with signal …
Run Code Online (Sandbox Code Playgroud)

c linux stack-overflow callstack

8
推荐指数
2
解决办法
582
查看次数

如何在windbg中检查特定调用堆栈帧上的寄存器值

我正在调查WinDBG中的Windows转储文件.我可以通过命令.frame切换调用堆栈帧,但我发现寄存器总是包含最后一个上下文.我的意思是,如果可以恢复属于不是最顶层的特定调用堆栈帧的上下文?

callstack windbg

8
推荐指数
1
解决办法
3211
查看次数

在python中获取函数调用者的信息

我想获得有关python中特定函数的调用者的信息.例如:

class SomeClass():
    def __init__(self, x):
        self.x = x
    def caller(self):
        return special_func(self.x)

def special_func(x):
    print "My caller is the 'caller' function in an 'SomeClass' class."
Run Code Online (Sandbox Code Playgroud)

有可能与python?

python callstack introspection

8
推荐指数
1
解决办法
6158
查看次数

在Python中,如何在保持原始调用堆栈的同时检查然后重新引发异常?

我有一种情况,我正在捕获一个特定的异常类型,检查异常的消息,检查它是否实际上是我想要捕获的异常,然后重新引发异常,如果不是:

try:
    # do something exception-prone
except FooException as e:
    if e.message == 'Something I want to handle':
        # handle the exception
    else:
        raise e
Run Code Online (Sandbox Code Playgroud)

这很好,有一个问题.在我重新引发异常的情况下,该异常现在发生在我重新引发它(即at raise e)的行,而不是在最初发生异常的位置.这对于调试来说并不理想,您希望知道原始异常发生的位置.

因此我的问题是:在保持原始异常位置的同时捕获它之后,是否有任何方法可以重新引发或以其他方式"传递"异常?

注意:如果你想知道实际情况是什么:我正在使用动态导入一些模块__import__.我正在ImportError优雅地处理任何这些模块不存在的情况.但是,如果这些模块中的任何一个本身都包含一个引发的import语句ImportError,我希望引发那些"真实的"(从我的应用程序的角度来看)异常 - 并且在调试工具的原始位置担心.

python callstack exception-handling

8
推荐指数
1
解决办法
906
查看次数

在调用堆栈中显示特殊的基本函数

这个问题提示了以下问题:有没有办法查看调用堆栈中的特殊基本函数?

例如,创建一个在退出时返回调用堆栈的函数:

myFun <- function(obj){
  on.exit(print(sys.calls()))
  return(obj)
}
Run Code Online (Sandbox Code Playgroud)

调用此函数并将其结果分配给对象使用assign避免使用特殊的原始函数:

> assign("myObj",myFun(4))
[[1]]
assign("myObj", myFun(4))

[[2]]
myFun(4)
Run Code Online (Sandbox Code Playgroud)

但是使用赋值运算符,它会被排除在堆栈之外

> `<-`(myObj, myFun(6))
[[1]]
myFun(6)
Run Code Online (Sandbox Code Playgroud)

当然,它可能不是所有的共同希望看到在调用栈中的赋值运算符,而其他功能,如rep和log也得到隐蔽

callstack r

8
推荐指数
1
解决办法
308
查看次数

Eclipse 3.8:调用层次结构错过了来自jar的调用者

Eclipse JDT 3.8中的Call Hierarchy视图似乎只显示当前项目/工作集中自己的类的引用/调用者.
来自jar/library的呼叫者不再显示.

相比之下,在eclipse <= 3.6中,这显示了所有调用者,包括来自库的调用者.

例:

  1. CTRL-SHIFT-T; 打开DocumentBuilderFactory
  2. 在方法大纲中,右键单击 setAttribute()
  3. 选择Call Hierarchy从上下文菜单
  4. 确保在"呼叫"层次结构设置中启用" 显示呼叫者层次结构".

Eclipse 3.8显示没有匹配,而Eclipse 3.6显示(至少)一个匹配 (使用jdk 6测试)

(在"搜索范围"设置中,选中所有选项)

问题:
有没有办法在eclipse 3.8中启用以前的行为,还是一个bug?


(同样的问题可以在"Show Callee Hierachy"模式中看到 - 它不再显示来自jdk类的任何内部被调用者,例如比较被调用者ArrayList.get())

java eclipse ide callstack eclipse-jdt

8
推荐指数
1
解决办法
1477
查看次数

push和pop如何在程序集中工作

我对pop组装中的实际操作感到困惑.是否pop将值PUSHed最后移动到堆栈上(意味着如果我们MOV在最后一个元素之后的值,它不适用PUSH)或者它只是弹出堆栈中最后一个值(因此,应用于两个MOV和PUSH),或者它会弹出堆栈指针指向的值吗?请考虑以下代码:

push $4
mov $5, -4(%esp)
add $4, %esp (esp pointing to an unknown value)
pop %ebp
Run Code Online (Sandbox Code Playgroud)

所以在这段代码中,值的值ebp是4,5,还是指向的未知值esp?

x86 assembly callstack

8
推荐指数
2
解决办法
3万
查看次数

是否可以在不丢失行号前缀的情况下包装log.Logger函数?

使用该log.Lshortfile标志时,记录器会在所有日志行前加上记录器函数调用的文件名和行号,例如:

myfile.go:14: Hello, world!

如果我像这样包装日志函数,例如:

func info(pattern string, args ...interface{}) {
    myLogger.Printf(pattern + "\n", args...)
}
Run Code Online (Sandbox Code Playgroud)

此函数发出的每一行都将以Printf调用的行号为前缀.这是预期的,但是期望的行为是每行都以要info调用的行的行号为前缀.

它有什么办法吗?

logging callstack go

8
推荐指数
1
解决办法
1440
查看次数

异步递归.我的记忆在哪里?

这更多地出于好奇而不是任何现实世界的问题.

请考虑以下代码:

void Main()
{
    FAsync().Wait();
}

async Task FAsync()
{
    await Task.Yield();
    await FAsync();
}
Run Code Online (Sandbox Code Playgroud)

在同步世界中,这最终会导致堆栈溢出.

在异步世界中,这只会消耗大量内存(我认为这与我可能松散地称之为"异步堆栈"的内容有关?)

这些数据到底是什么,以及如何保存?

c# memory recursion callstack async-await

7
推荐指数
1
解决办法
472
查看次数