c# – 当P /调用dlopen时的SIGSEGV
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 当P /调用dlopen时的SIGSEGV,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5503字,纯文字阅读大概需要8分钟。
内容图文
![c# – 当P /调用dlopen时的SIGSEGV](/upload/InfoBanner/zyjiaocheng/721/32982f21a80041a8a90077851d1832a1.jpg)
我正在尝试编写一个抽象来在Windows和Linux上加载动态库.在Windows平台上,一切都很顺利,当我调用dlopen时,我得到一个SIGSEGV:
// File: Main.cs
using System;
using System.Runtime.InteropServices;
namespace DlopenTest
{
class MainClass
{
const int RTLD_NOW = 2;
[DllImport("dl")]
static extern IntPtr dlopen([MarshalAs(UnmanagedType.LPTStr)] string filename, int flags);
[DllImport("dl")]
static extern IntPtr dlsym(IntPtr handle, [MarshalAs(UnmanagedType.LPTStr)] string symbol);
public static void Main (string[] args)
{
IntPtr libraryHandle = dlopen("libc.so.6", RTLD_NOW);
Console.WriteLine ("Success!");
}
}
}
输出如下:
Stacktrace:
at (wrapper managed-to-native) DlopenTest.MainClass.dlopen (string,int) <0x00004>
at (wrapper managed-to-native) DlopenTest.MainClass.dlopen (string,int) <0x00004>
at DlopenTest.MainClass.Main (string[]) [0x00000] in /home/luca/Projects/DlopenTest/DlopenTest/Main.cs:18
at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x0001d, 0x00043>
Native stacktrace:
/usr/bin/mono() [0x80d5b19]
/usr/bin/mono() [0x810f7ab]
[0xb771940c]
/lib/ld-linux.so.2(+0x119a8) [0xb772b9a8]
/usr/lib/libdl.so(+0xc0b) [0xb536dc0b]
/lib/ld-linux.so.2(+0xdb36) [0xb7727b36]
/usr/lib/libdl.so(+0x109c) [0xb536e09c]
/usr/lib/libdl.so(dlopen+0x41) [0xb536db41]
[0xb58672f1]
[0xb58671bd]
[0xb5867234]
/usr/bin/mono() [0x8064428]
/usr/bin/mono(mono_runtime_invoke+0x40) [0x812d4e0]
/usr/bin/mono(mono_runtime_exec_main+0xde) [0x8130f8e]
/usr/bin/mono(mono_runtime_run_main+0x112) [0x8131292]
/usr/bin/mono(mono_main+0x15ec) [0x80b3bdc]
/usr/bin/mono() [0x805b675]
/lib/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0xb74b8ca6]
/usr/bin/mono() [0x805b5b1]
Debug info from gdb:
=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
=================================================================
这是怎么回事?
我的glibc版本是2.11.3,单声道运行时是2.6.3.
编译程序:mono-csc Main.cs
要运行该程序:./ Main.exe
我刚刚完成了测试应用程序的执行.这是SIGSGV之前的系统调用:
...
open("/usr/lib/libdl.so", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\n\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=9736, ...}) = 0
mmap2(NULL, 12408, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb598b000
mmap2(0xb598d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1) = 0xb598d000
close(3) = 0
mprotect(0xb598d000, 4096, PROT_READ) = 0
munmap(0xb598f000, 76774) = 0
gettimeofday({1333269422, 515602}, NULL) = 0
gettimeofday({1333269422, 515653}, NULL) = 0
gettimeofday({1333269422, 515828}, NULL) = 0
gettimeofday({1333269422, 515884}, NULL) = 0
gettimeofday({1333269422, 515986}, NULL) = 0
gettimeofday({1333269422, 516059}, NULL) = 0
gettimeofday({1333269422, 516613}, NULL) = 0
gettimeofday({1333269422, 516670}, NULL) = 0
brk(0x98e3000) = 0x98e3000
brk(0x98e1000) = 0x98e1000
gettimeofday({1333269422, 516916}, NULL) = 0
brk(0x98de000) = 0x98de000
brk(0x98dc000) = 0x98dc000
brk(0x98db000) = 0x98db000
gettimeofday({1333269422, 517092}, NULL) = 0
gettimeofday({1333269422, 517200}, NULL) = 0
gettimeofday({1333269422, 517261}, NULL) = 0
gettimeofday({1333269422, 517368}, NULL) = 0
gettimeofday({1333269422, 517525}, NULL) = 0
gettimeofday({1333269422, 517762}, NULL) = 0
gettimeofday({1333269422, 517823}, NULL) = 0
gettimeofday({1333269422, 518007}, NULL) = 0
gettimeofday({1333269422, 518074}, NULL) = 0
gettimeofday({1333269422, 518435}, NULL) = 0
gettimeofday({1333269422, 518486}, NULL) = 0
gettimeofday({1333269422, 518648}, NULL) = 0
gettimeofday({1333269422, 518699}, NULL) = 0
gettimeofday({1333269422, 518803}, NULL) = 0
futex(0xb598e06c, FUTEX_WAKE_PRIVATE, 2147483647) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
通过调用“strace /opt/mono-2.10/bin/mono ./DlopenTest.exe 2> strace”生成此跟踪
默认单声道安装(2.6)它几乎相似,它总是在同一点崩溃.
如何调试这个条件?我没有想法……也许dlopen只是一个包装器,所以我可以调用替代函数?也许我在一个错误的环境中执行单声道2.10(也许我必须指定一些环境变量才能使这个工作)?
解决方法:
您的代码适用于Mono 2.10.
$mono --version
Mono JIT compiler version 2.10.5 (Debian 2.10.5-1)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: altstack
Notifications: epoll
Architecture: x86
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: Included Boehm (with typed GC and Parallel Mark)
$cat so.cs
using System;
using System.Runtime.InteropServices;
namespace DlopenTest
{
class MainClass
{
const int RTLD_NOW = 2;
[DllImport("dl")]
static extern IntPtr dlopen([MarshalAs(UnmanagedType.LPTStr)] string filename, int flags);
[DllImport("dl")]
static extern IntPtr dlsym(IntPtr handle, [MarshalAs(UnmanagedType.LPTStr)] string symbol);
public static void Main (string[] args)
{
IntPtr libraryHandle = dlopen("libc.so.6", RTLD_NOW);
Console.WriteLine ("Success!");
}
}
}
$mcs so.cs
so.cs(18,20): warning CS0219: The variable `libraryHandle' is assigned but its value is never used
Compilation succeeded - 1 warning(s)
$mono so.exe
Success!
它似乎在2.6下失败了(这是很常见的东西)但是这个版本如果已经很多年了……我强烈建议你升级.
内容总结
以上是互联网集市为您收集整理的c# – 当P /调用dlopen时的SIGSEGV全部内容,希望文章能够帮你解决c# – 当P /调用dlopen时的SIGSEGV所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。