Articles of 未处理exception

在Windows上修改堆栈,TIB和exception

我的问题的由来源于想要提供在Windows上支持用户提供堆栈的pthreads的实现。 具体来说, pthread_attr_setstack应该做一些有意义的事情。 我的实际需求比这个多一点,但是这对于这个post来说足够好了。 没有用于在光纤或线程API中提供堆栈的公共Win API。 我search了偷偷摸摸的后门,解决方法和黑客,没有任何进展。 实际上,我看到了winpthread源代码的灵感,忽略了任何提供给pthread_attr_setstack堆栈。 相反,我尝试了下面的“解决scheme”,看看它是否会工作。 我使用ConvertThreadToFiber , CreateFiberEx和SwitchToFiber的常用组合创build一个光纤。 在CreateFiberEx我提供了最小的堆栈大小。 在光纤的入口点,然后为堆栈分配内存,相应地更改TIB字段:“Stack Base”和“Stack Limit”(请参见http://en.wikipedia.org/wiki/Win32_Thread_Information_Block ),然后设置ESP到我的堆栈的高地址。 (在现实世界的情况下,我会设置堆栈比这更好,并改变EIP,以便这一步的行为更像POSIXfunction的swapcontext ,但你明白了)。 如果我在这个不同的堆栈上做任何操作系统调用,那么我几乎搞砸了(例如printf死亡)。 然而,这对我来说不是问题。 我可以确保我在自定义堆栈上从不确定调用(因此为什么我说我的实际需求有一点涉及)。 除了…我需要例外的工作。 而他们不! 具体来说,如果我尝试抛出并捕获exception,我修改的堆栈,然后我得到一个断言 未处理的exception在0xXXXXXXXX …. 所以我的(模糊)问题是,有没有人有任何洞察力,如何exception和自定义堆栈可能不是很好地一起玩? 我明白,这是完全不受支持的,除了零响应或“走开”以外,可以愉快地开展工作。 事实上,我已经决定了,我需要一个不同的解决scheme,尽pipe这涉及妥协,我可能会使用一个。 然而,好奇心越来越好,所以我想知道为什么这不起作用。 在一个相关的笔记,我想知道Cygwin如何处理这个ucontext。 源代码http://szupervigyor.ddsi.hu/source/in/openjdk-6-6b18-1.8.13/cacao-0.99.4/src/vm/jit/i386/cygwin/ucontext.c使用GetThreadContext / SetThreadContext实施ucontext。 但是,从实验中我看到,当从新的上下文中抛出exception时,这也失败了。 实际上, SetThreadContext调用甚至不更新TIB块! 编辑(根据@avakar的答案) 下面的代码与您的代码非常相似,performance出同样的错误。 不同的是,我不启动第二个线程暂停,但暂停它,然后尝试更改上下文。 这段代码展示了我在描述try-catch块在foo 。 也许这根本不合法。 值得注意的是,在这种情况下,当modifyThreadContext时,TIB的ExceptionList成员是一个有效的指针,而在你的例子中它是-1。 手动编辑这没有帮助。 正如我对你的回答评论所述。 这不是我所需要的。 我想从我目前的线程切换上下文。 但是, SetThreadContext的文档警告不要在活动线程上调用它。 所以我猜如果下面的代码不起作用,那么我没有机会使它在单个线程上工作。 namespace { HANDLE […]

JVM崩溃,我不明白为什么

嘿家伙,我想我已经find了什么是造成这个错误,但我不明白为什么或如何解决它。 我曾尝试在两台Windows 7和一台Windows 8计算机上运行此代码,结果相同。 错误并不总是发生,但有时会发生。 这是我认为导致它的一段代码。 private WatchKey registerPath(Path path) { try { System.out.println("Making Key for: " + path.toString()); System.out.println("ChangesWatcher: " + changesWatcher); WatchKey key = path.register(changesWatcher, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_CREATE); System.out.println("Done Making Key"); return key; } catch (Exception err) { err.printStackTrace(System.out); return null; } } 这是控制台输出: Making Key for: C:\Users\Fiona\Simple Cloud ChangesWatcher: sun.nio.fs.WindowsWatchService@2be33a92 # # […]

SharpSSH .NET Library:无法从.NET连接到Linux(Debian)

我试图用SharpSSH连接到Linux,但是我无法连接到Linux。 我想从我的.NET应用程序运行一些Linux命令。 安装说明: SharpSsh – 通过SSH连接到UNIX的.NET库 – 创build帐户@ codeproject.com ( http://www.codeproject.com/Articles/11966/sharpSsh-A-Secure-Shell-SSH-library-for-NET (下载演示项目和二进制文件/ dll文件) – 复制到“SharpSsh”文件夹中 我正在运行此下载附带的sharpSshTest控制台应用程序。 当我通过Putty手动SSH(端口22)到Linux相同的主机/login名/密码,我可以很好地连接。 当通过.NET连接相同的主机和证书时,我得到了Tamir.sharpSsh .NET库中引发的exception。 Unix发行版和版本: $ lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 5.0.9 (lenny) Release: 5.0.9 Codename: lenny 堆栈跟踪: at Tamir.SharpSsh.jsch.Session.connect(Int32 connectTimeout) at Tamir.SharpSsh.jsch.Session.connect() at Tamir.SharpSsh.SshStream..ctor(String host, String username, String password) at sharpSshTest.sharpSshTest.SshStream() […]

有一个函数来调用堆栈转储在C?

有人可以提供一个C函数的实现,被调用来转储当前的堆栈吗? 这是一个x86 linux系统。 它可以通过两种方式调用:明确地由另一个函数或崩溃后(可能作为陷阱/ int处理程序)。 输出可以是屏幕或文件,如参数(句柄)所示。 如何解开堆栈的明确解释/评论显然是非常有用的。 谢谢。

Linux上来自共享对象(.so)的例外情况

我有一个名为ftest的testing程序。 它加载包含testing的.so文件,并运行它在其中find的testing。 其中一个testing加载并运行一个包含我们的O / RM的Postgres数据库驱动程序的.so。 当Postgres驱动抛出一个在.so文件中定义的exception(或者它链接到的但是ftest没有链接到的),并被testing框架捕获时,exception析构函数会触发一个段错误。 只要编译的exception处于已经被dynamic加载(使用dload)的.so中,就会发生这种段错误。 这种事情在Windows中具有相同的架构正常工作。 我们并不想限制自己只使用来自核心库的exception – 插件应该可以自由地创build自己的exception类,并使它们正常处理。 exception是std :: exception的子类。 有时例外可能在库中定义(如libpqxx),这意味着exception有时也不在我们的控制范围之内。 抛出exception使用类似的东西: throw exception_class( exception_arguments ); 并被捕获使用: catch ( std::exception &e ) { // handler code } 是否有一些特殊的编译器选项需要得到这个工作? 我们是否需要通过throw new exception_class( args )来切换抛出exception(我们不是真的想这样做)?

如何禁用浮点单元(FPU)?

我想在x86系统中禁用FPU / MMX / SSE指令,并且我将实现一个Device-Not-Availableexception处理程序。 我已经提到了Control register的维基页面 ; 看来我必须在cr0寄存器中设置一些标志。 如何在cr0中设置这些标志,并在启动时进行这项工作?

C中没有C ++的exception处理

Linux是否提供了C中的exception处理而不使用C ++? 或者,什么可能是实现这种exception处理的最佳方式? 目标是避免检查每个被调用的函数的返回码,而是使用C ++中的线程安全且便于携带的方法。

.eh_frame和.eh_frame_hdr部分存储的是什么?

我知道,在使用支持exception的语言(如C ++)时,必须向运行时环境提供附加信息,以描述在处理exception期间必须展开的调用帧。 此信息包含在对象文件的特殊部分中,例如.eh_frame和.eh_frame_hdr 。 但是,这些部分存储了什么样的数据结构呢? 我的意思是,他们可以通过使用任何C结构? 他们和GNU汇编代码中的.cfi语句(如.cfi_startproc , .cfi_endproc , .cfi_offset , .cfi_def_cfa_offset , .cfi_personality和.cfi_lsda )有什么关系? 如果他们这样做,这些条款中的每一个在这些部分中造成了什么? .eh_frame_hdr部分与.eh_frame之一有什么关系? 我希望尽可能多的使用C结构的解释。 谢谢。

为什么我的信号处理程序(抛出exception)不止触发一次?

我正在尝试使用sigaction设置exception处理程序。 它适用于第一个例外。 但是sigaction处理程序在第一个exception之后不会被调用,并且第二个信号发生时程序会突然结束。 #include <iostream> #include <signal.h> #include <exception> #include <string.h> typedef void (*SigactionHandlerPointer)(int iSignal, siginfo_t * psSiginfo, void * psContext); using namespace std; void SigactionHookHandler( int iSignal, siginfo_t * psSiginfo, void * psContext ) { cout << "Signal Handler Exception Caught: std::exception — signal : " << iSignal << " from SigactionHookHandler()" << endl; […]

为什么linux内核使用陷阱门来处理divide_errorexception?

在内核2.6.11.5中,除零exception处理器被设置为: set_trap_gate(0,&divide_error); 根据“了解Linux内核”,英特尔陷阱门不能被用户模式进程访问。 但是用户模式进程很可能也会产生divide_error 。 那么为什么Linux以这种方式实现呢? [编辑]我认为问题仍然是开放的,因为set_trap_gate()设置IDT条目的DPL值为0,这意味着只有CPL = 0(读取内核)代码可以执行它,所以我不清楚这个处理程序可能是从用户模式调用: #include<stdio.h> int main(void) { int a = 0; int b = 1; b = b/a; return b; } 这是用gcc div0.c编译的。 而./a.out的输出是: 浮点exception(核心转储) 所以这看起来不像是由0陷阱代码处理的。