我有一个名为ftest的测试程序.它加载包含测试的.so文件并运行它在那里找到的测试.其中一个测试加载并运行.so,其中包含用于O/RM的Postgres数据库驱动程序.
当Postgres驱动程序抛出一个在该.so文件中定义的异常(或者它链接到的那个,但是ftest没有链接到它)并被测试框架捕获时,异常析构函数会触发段错误.
只要编译的异常位于动态加载的.so中(使用dload),就会发生此段错误.
这种东西在具有相同架构的Windows中运行良好.我们并不想限制自己只使用来自核心库的异常 - 加载项应该可以自由创建自己的异常类并让它们正常处理.
例外是std :: exception的子类.有时可以在库中定义异常(例如libpqxx),这意味着异常有时也不受我们的控制.
使用以下内容抛出异常:
throw exception_class( exception_arguments );
Run Code Online (Sandbox Code Playgroud)
并使用:
catch ( std::exception &e ) {
// handler code
}
Run Code Online (Sandbox Code Playgroud)
是否需要一些特殊的编译器选项才能使其正常工作?我们是否需要切换到通过throw new exception_class( args )(我们真的不想这样做)抛出异常?
我正在尝试使用red5媒体服务器创建一个简单的聊天客户端,但我似乎有轻微的打嗝.我正在服务器端创建一个共享对象,它似乎正在成功创建它.但是,当我通过客户端更改对象(键入消息)时,会触发SYNC事件,但共享对象中的内容仍为空.我怀疑我在java端做错了什么,有什么建议吗?
控制台结果:
Success!
Server Message: clear
Server Message: [object Object]
Local message: asdf
Server Message: change
Server Message: [object Object]
Local message: fdsa
Server Message: change
Server Message: [object Object]
Local message: fewa
Server Message: change
Server Message: [object Object]
Run Code Online (Sandbox Code Playgroud)
服务器端:
package org.red5.core;
import java.util.List;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.service.ServiceUtils;
import org.red5.server.api.so.ISharedObject;
// import org.apache.commons.logging.Log;
// import org.apache.commons.logging.LogFactory;
public class Application extends ApplicationAdapter {
private IScope appScope;
// private static final Log log = LogFactory.getLog( Application.class ); …Run Code Online (Sandbox Code Playgroud) 我写了一个简单的C++程序来说明我的问题:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我把它编译成一个.从python我打电话:
from ctypes import *
libso = CDLL("Debug/libctypesTest.so")
func = libso.test
func.res_type = c_int
for i in xrange(5):
charP = c_char_p('bye')
func(i,charP)
print charP.value
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我的输出是:
bye
hi
hi
hi
hi
Run Code Online (Sandbox Code Playgroud)
我期望:
bye
hi
bye
bye
bye
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
谢谢.
我已经获得了一个共享对象文件(.so)及其中的函数,但我不知道如何使用它,或者改变它以便在iOS应用程序中使用.有人能指出我正确的方向吗?
我知道.so来自一个Android应用程序,但我被告知我可以让它在iOS应用程序中工作.
我在我的Flex项目中有一个名为HashMap的便捷集合类,它本质上是flash.utils.Dictionary的包装器,带有一堆便捷方法和一个添加的(同步的)ArrayCollection,这样我就可以将HashMap传递给想要的可绑定控件了一个ArrayCollection.一切正常.
什么是不行的,我刚才发现,将HashMap放在本地的SharedObject中.
注册该类会导致它被存储并以正确的类型返回,并且ArrayCollection成员返回正常,但是Dictionary不存储其数据.
这是一个片段:
[RemoteClass(alias="com.tamedtornado.collections.HashMap")]
public class HashMap extends Proxy
{
public var hash:Dictionary = new Dictionary();
// Keeps an array collection as well so we can give this to a data bound control
[Bindable]
public var collection:ArrayCollection = new ArrayCollection();
Run Code Online (Sandbox Code Playgroud)
这就是相关的东西.让字典正确存储的过程是什么?我实际上必须使ArrayCollection瞬态,就像现在每次刷新SO时,我得到另一个(在Dictionary中唯一键入)数据的副本.
我正在尝试在Flex 4.5移动项目中使用SharedObject.我使用的SDK是4.5.1,AIR版本是2.6.0.
我正在尝试使用以下代码在本地存储我的应用程序的用户凭据:
var so:SharedObject = SharedObject.getLocal("cred");
so.data.user = txtUser.text;
so.data.password = txtPass.text;
so.data.rememberMe = isLoginRemembered.selected;
var result:String = so.flush();
Run Code Online (Sandbox Code Playgroud)
之后,当应用程序再次加载时,我想使用以前保存的SharedObject凭据,因此用户不需要每次都输入他的凭据.
var so:SharedObject = SharedObject.getLocal("cred");
txtUser.text = so.data.user;
txtPass.text = so.data.password;
isLoginRemembered.selected = so.data.rememberMe;
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,用户和密码从未保存过,因此无效.如果我在我的文件系统(Mac OSX)上寻找cred.sol文件,我甚至找不到该文件!这一切都在"结果"字符串中显示为"刷新".
我正在Mac上开发这个应用程序,并希望部署到iOS.
有什么建议?
我正在编写一个应该被LD_PRELOAD编入进程的共享对象。
在那个共享对象中我有一些初始化,例如
__attribute__((constructor)) void initFunc();
Run Code Online (Sandbox Code Playgroud)
我希望在流程中的任何其他代码之前被调用。
对于只是可执行文件的进程,这可以正常工作,但如果该进程本身依赖于其他一些共享对象,那么它们会在我的LD_PRELOAD共享对象之前初始化。
我尝试为链接器提供选项-Wl,-z,initfirst,但这似乎根本没有任何效果。当我运行该进程时,LD_DEBUG=files我仍然看到该应用程序在我的应用程序之前启动。
我运行的是 CentOS 5.5
我有 ac 程序(.c 文件)。我正在将其转换为共享对象(.so)。如何从我的 python 代码调用和运行共享对象?如果可能,请向我建议可以帮助我完成此任务的库列表。
我正在开发一个C ++应用程序,在这里我需要测试.SO是32位还是64位,然后再加载它。
我设法在Windows上使用Headers文件进行了评估。
现在,我正在寻找一种在Linux中进行评估的方法。
最初,我想使用C ++中的函数或方法来执行此操作,即不调用system()外部程序(file,objdump...)。
如果我们的社区可以帮助我找到解决方案,我将非常感谢。
谢谢!
共享对象(.so 文件)的代码(也称为 .text 部分)通常在进程之间共享。你可以在这里阅读它。
我写了一个小例子,其中事情似乎表现不同。
简而言之:程序证明对共享对象的代码部分所做的更改不会影响程序的其他实例。因此,共享对象的代码部分不在进程之间共享。
长解释:该代码由一个加载 .so 文件(mylib.c)的程序(main.c)组成。
该库由一个返回整数的函数组成。该整数与机器指令一起存储在代码段中。如果您不相信整数存储在代码部分中,您可以运行objdump -d libmy.so.
程序加载库,然后修改共享对象代码部分中的整数。在此之前,程序运行mprotect()以避免分段错误。该值正在更改为当前时间戳。
现在,我运行该程序两次,延迟 2 秒,因此每个实例都将其自己的值写入 .so 代码部分。令人惊讶的是,第一个实例的值没有被第二个实例的值覆盖。
这怎么可能?
我仅在 x64 上测试了该程序。只需保存文件并运行 bash 脚本即可。
libmy.c:
int getval()
{
return 123;
}
Run Code Online (Sandbox Code Playgroud)
主要.c:
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/mman.h>
int getval();
void unprotect(uint64_t addr)
{
uint64_t pagesize = sysconf(_SC_PAGE_SIZE);
addr -= addr % pagesize;
if (mprotect((void*)addr, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
{
printf("mprotect failed\n"); …Run Code Online (Sandbox Code Playgroud) shared-objects ×10
linux ×4
c++ ×3
apache-flex ×2
c ×2
flash ×2
python ×2
actionscript ×1
ctypes ×1
cython ×1
exception ×1
g++ ×1
ios ×1
java ×1
ld-preload ×1
red5 ×1