小编Gri*_*rge的帖子

什么可以导致Java本机函数(在C中)在进入时出现段错误?

该项目

我正在使用Java Native Interface为内部网络和网络测试工具的C库编写Java命令行界面.C代码(我没有写)是复杂的低级别,通常在位级别操作内存,并且只使用原始套接字.应用程序是C端的多线程(后台运行的pthread)以及Java端(ScheduledThreadPoolExecutors运行调用本机代码的线程).也就是说,C库应该基本稳定.事实证明,Java和JNI接口代码会导致问题.

问题

应用程序在进入本机C函数时崩溃并出现分段错误.这仅在程序处于特定状态时才会发生(即,成功运行特定本机函数会导致下一次调用另一个特定本机函数进行段错误).此外,当应用程序崩溃时,应用程序崩溃时会出现类似的段错误quit发出命令,但同样,只有在成功运行相同的特定本机函数之后才会.

我是一个没有经验的C开发人员和经验丰富的Java开发人员 - 我习惯崩溃,给我一个特定的原因和一个特定的行号.在这种情况下,我所有的工作就是hs_err_pid*.log输出和核心转储.在这个问题的最后,我已经包含了我所能做的.

我的工作到目前为止

  1. 当然,我想找到发生崩溃的特定代码行.我System.out.println()在Java端的本机调用之前放置了一个权限,并且printf()作为本机函数的第一行,程序崩溃fflush(stdout)后必须直接使用.该System.out呼叫跑和printf呼吁没有.这告诉我,在进入函数时发生了段错误 - 这是我以前从未见过的.
  2. 我将参数三重检查到函数,以确保它们不会起作用.但是,我只传递一个参数(类型jint).另外两个(JNIEnv *env, jobject j_object)是JNI构造,并且不受我的控制.
  3. 我注释掉了函数中的每一行,最后只留下了一行return 0;.段错仍然发生.这让我相信问题不在这个功能中.
  4. 我以不同的顺序运行命令(有效地运行本机函数不同的命令).只有在崩溃函数调用之前运行一个特定的本机函数时才会发生段错误.此特定功能在运行时似乎表现正常.
  5. 我打印了env指针的值和&j_object接近另一个函数末尾的值,以确保我没有以某种方式破坏它们.我不知道我是否损坏了它们,但是在退出函数时它们都具有非零值.
  6. 编辑1:通常,相同的函数在许多线程中运行(通常不是并发的,但它应该是线程安全的).我从主线程运行该函数,而没有任何其他线程处于活动状态,以确保Java端的多线程不会导致问题.它不是,我得到了相同的段错误.

所有这一切都困扰着我.如果我注释掉整个函数,除了返回语句之外,为什么它仍然是段错误?如果问题出现在这个其他功能中,为什么不在那里失败?如果第一个函数弄乱内存并且第二个函数非法访问损坏的内存是一个问题,为什么不在非法访问的行上失败,而不是进入函数?

如果您看到一篇互联网文章,其中某人解释了与我类似的问题,请对其进行评论.有很多段错误的文章,似乎都没有包含这个特定的问题.对于SO问题同样如此.问题也可能是我没有足够的经验来应用这个问题的抽象解决方案.

我的问题

什么可以导致Java本机函数(在C中)在这样输入时出现段错误?我可以找到哪些具体的东西来帮我压扁这个bug?我怎样才能在将来编写代码来帮助我避免这个问题呢?

有用的信息

为了记录,我实际上无法发布代码.如果您认为代码的描述会有所帮助,请注释,我将对其进行编辑.

错误信息

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00002aaaaaf6d9c3, pid=2185, tid=1086892352
#
# JRE version: 6.0_21-b06 …
Run Code Online (Sandbox Code Playgroud)

c java java-native-interface segmentation-fault

26
推荐指数
1
解决办法
5421
查看次数

UDDI注册中心有哪些好的替代方案?

我在一个大型组织SOA原型组织中担任实习生应用程序开发人员.我是Web服务和技术的新手,如WSDL,SOAP,UDDI等.

在过去的一周里,我在理解UDDI以及如何有效地使用UDDI方面遇到了很多困难.互联网上普遍的共识是,UDDI已经死了,要么太复杂,要么不需要,要么就是大多数用例的障碍.一些网站暗示UDDI仅作为组织内部的注册表使用,而且它是密切的业务合作伙伴,而不是它所设计的通用业务注册中心.您可以通过阅读以下问题的一些答案和评论来了解StackOverflow对UDDI的态度:

UDDI有哪些替代方案?Web服务可以发布的其他方式是什么,以便开发人员可以找到描述和技术细节,而不具备UDDI似乎具有的任何复杂性?实际使用UDDI注册中心有什么好的商业案例吗?

soa web-services uddi

14
推荐指数
1
解决办法
7236
查看次数

又一个C++ cin循环问题

更新

我找到了问题的原因.我一直在尝试用贝.我看到有人说在Mac上成功运行我的代码的评论,并决定在标准的bash shell中尝试它.它工作得很好.所以,我猜没有鱼壳了.:)

我仍然很想知道cin如何以及为什么以它的方式工作.这是我提问的主要部分.


我遇到了一个流行的问题:cin在循环中使用.代码很简单,但我找不到解决方案.这些问题的答案谷歌已经提供我是多种多样的,但通常涉及的一些组合cin.clear(),cin.ignore()cin.get().不幸的是,我无法找到解决问题的组合或排序.而且,我觉得令人沮丧的是我没有完全理解它的功能cin.我宁愿不使用反复试验来解决这个问题.我想知道到底发生了什么.

应该发生什么

当我运行我的代码时,我应该看到一个带有选项列表的提示.我应该能够输入一个将运行其中一个选项的角色.然后,它应该再次显示提示并重复该过程,直到我选择退出选项.

实际发生了什么

一旦我运行代码,它会立即向屏幕打印提示,并最终在提示的中途停止.然后我无法做任何事情,但杀了它^C.

$ ./run

Choose an option:
[A]dd a score
[R]emove a player
[E]xit

    : That is not a valid input.

[repeated a bunch of times]

Choose an option:
[A]dd a score
[R]emove a player
[E]xit

    : That is not a valid input.


Choose ^C
$ 
Run Code Online (Sandbox Code Playgroud)

我的问题

是什么导致cin这样做?作为一名经验丰富的Java开发人员(但是初学C++开发人员),我熟悉缓冲区和流的概念等,但我不知道它是如何cin工作的.我知道cin.clear()清除错误状态,并cin.ignore()忽略流中的许多字符.到目前为止,我的Google-fu无法找到简明的参考资料.

为什么cin按照它的方式行事?如何 …

c++

5
推荐指数
1
解决办法
1456
查看次数