所以,我希望能够从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字节).对这个混乱的任何帮助将非常感激:)
我有两个简单的C++程序和两个问题.我在CentOS 5.2工作,我的开发环境如下:
计划#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) 我正在调查WinDBG中的Windows转储文件.我可以通过命令.frame切换调用堆栈帧,但我发现寄存器总是包含最后一个上下文.我的意思是,如果可以恢复属于不是最顶层的特定调用堆栈帧的上下文?
我想获得有关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?
我有一种情况,我正在捕获一个特定的异常类型,检查异常的消息,检查它是否实际上是我想要捕获的异常,然后重新引发异常,如果不是:
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,我希望引发那些"真实的"(从我的应用程序的角度来看)异常 - 并且在调试工具的原始位置担心.
这个问题提示了以下问题:有没有办法查看调用堆栈中的特殊基本函数?
例如,创建一个在退出时返回调用堆栈的函数:
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也得到隐蔽
Eclipse JDT 3.8中的Call Hierarchy视图似乎只显示当前项目/工作集中自己的类的引用/调用者.
来自jar/library的呼叫者不再显示.
相比之下,在eclipse <= 3.6中,这显示了所有调用者,包括来自库的调用者.
例:
CTRL-SHIFT-T; 打开DocumentBuilderFactorysetAttribute()Call Hierarchy从上下文菜单Eclipse 3.8显示没有匹配,而Eclipse 3.6显示(至少)一个匹配 (使用jdk 6测试)
(在"搜索范围"设置中,选中所有选项)
问题:
有没有办法在eclipse 3.8中启用以前的行为,还是一个bug?
(同样的问题可以在"Show Callee Hierachy"模式中看到 - 它不再显示来自jdk类的任何内部被调用者,例如比较被调用者ArrayList.get())
我对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?
使用该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调用的行的行号为前缀.
它有什么办法吗?
这更多地出于好奇而不是任何现实世界的问题.
请考虑以下代码:
void Main()
{
FAsync().Wait();
}
async Task FAsync()
{
await Task.Yield();
await FAsync();
}
Run Code Online (Sandbox Code Playgroud)
在同步世界中,这最终会导致堆栈溢出.
在异步世界中,这只会消耗大量内存(我认为这与我可能松散地称之为"异步堆栈"的内容有关?)
这些数据到底是什么,以及如何保存?