可能的堆栈损坏

2023-12-29

参考我之前的问题GDB 未精确定位 SIGSEGV 点 https://stackoverflow.com/q/3971091/191776,

我的线程代码如下:

void *runner(void *unused)
{
 do
 {
 sem_wait(&x);
  ...

  if(/*condition 1 check*/)
  {
   sem_post(&x);
   sleep(5);
   sem_wait(&x);
   if(/*repeat condition 1 check; after atleast 5 seconds*/)
   {
    printf("LEAVING...\n");
    sem_post(&x); 
    // putting exit(0); here resolves the dilemma
    return(NULL);  
   }
  }
 sem_post(&x);
 }while(1);

}

主要代码:

sem_t x;    

int main(void)
{   
    sem_init(&x,0,1);
        ...
    pthread_t thrId;
    pthread_create(&thrId,NULL,runner,NULL);
        ...
    pthread_join(thrId,NULL);
    return(0);
}

Edit:在运行程序线程代码中添加 exit(0) 可以使故障消失。


堆栈损坏背后的原因可能是什么?

GDB 输出:(0xb7fe2b70是运行线程ID)

LEAVING...
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ?? ()

Valgrind 输出:

==3076== Thread 2:
==3076== Jump to the invalid address stated on the next line
==3076==    at 0x11: ???
==3076==    by 0xA26CCD: clone (clone.S:133)
==3076==  Address 0x11 is not stack'd, malloc'd or (recently) free'd
==3076== 
==3076== 
==3076== Process terminating with default action of signal 11 (SIGSEGV)
==3076==  Bad permissions for mapped region at address 0x11
==3076==    at 0x11: ???
==3076==    by 0xA26CCD: clone (clone.S:133)
==3076==  Address 0x11 is not stack'd, malloc'd or (recently) free'd

编写一个新的源文件main功能与执行相同的操作main你在这里发布除了而不是使用pthread_create只需调用该函数即可。看看是否可以独立于使用线程重新创建问题。从表面上看,您的信号量在单线程环境中应该仍然可以正常工作。

如果仍然失败,您将可以更轻松地调试它。

既然你说打电话exit而不是返回没有产生错误,它会表明您已经损坏了堆栈上的返回地址runner已开始。通过致电exit您不依赖此内存区域来访问退出函数(如果您返回了 pthread_exit 将由调用过的 pthread 库代码调用runner)。我认为 valgrind 输出不是 100% 准确 - 不是由于 valgrind 中的任何错误,而是因为触发错误的位置以及触发的错误类型使得很难确定谁调用了什么。

Some gcc您可能感兴趣的标志:

-fstack-protector-all -Wstack-protector

如果没有 -f 选项,警告选项将不起作用。

您可能还想尝试:

-fno-omit-frame-pointer
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可能的堆栈损坏 的相关文章

  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • NHibernate手动控制抓取

    我正在使用 NHibernate 我想控制手动获取相关实体 这是我的示例实体 public class Post public virtual long Id get set public virtual string Title get
  • 有没有一种简单的方法来获取 .NET 为参数化查询生成的“sp_executesql”查询?

    背景 如果我有以下程序 public class Program public static void Main using var connection new SqlConnection Server local Database Te
  • ctypes.ArgumentError:不知道如何转换参数

    我在C库中定义了一个函数 如下所示 int Test char str1 int id1 char str2 float val float ls 我想在Python中使用它 所以我编写了以下Python代码 str1 a str2 b i
  • iPhone 编程游戏

    使用 Objective C 还是 C 为 iPhone 编写游戏最好 像 Flight Control 这样的游戏会用什么语言编写 图形应采用什么格式才能在 iPhone 上正确显示并快速加载 像 Flight Control 这样的游戏
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • System.NotSupportedException:“集合是只读的。”从 iList 中删除对象时抛出

    运行下面的代码片段时抛出异常 我有一个 iListof webelements 如果该元素包含字符串 WSC 我想将其从 iList 中删除 谁能帮我吗 代码如下 IList
  • 在 C# 中给定周数和年份,计算一周的开始和结束日期(基于 ISO 规范)

    我需要生成一份报告 显示一年中的 52 周 或某些年份的 53 周 及其开始日期和结束日期 有一个 ISO 规范可以做到这一点 但看起来非常复杂 我希望有人知道在 C 或 Visual Basic 中执行此操作的方法 实际上适用于 Visu
  • 需要帮助将 winform 迁移到 net 5

    我正在将 winform 应用程序从 net core 3 1 移植到 net 5 并收到以下错误 严重性代码 说明 项目文件行抑制状态 错误NETSDK1136 目标平台必须设置为Windows 通常 通过在 TargetFramewor
  • 给出对象的指针作为参数

    假设我有 void func foo obj 我有 foo object 我该如何制作object进入争论func 只需取消引用它即可 func object
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • Parallel ForEach 的本地初始化如何工作?

    我不确定 Parallel ForEach 中本地 init 函数的使用 如 msdn 文章中所述 http msdn microsoft com en us library dd997393 aspx http msdn microsof
  • 创建 PING 程序时限制 ICMP 回显答复

    我正在编写一个多线程 ping 程序 我在每个线程 针对每个 IP 上创建了原始套接字 并使用 sendto 向每个线程发送了 ICMP Echo 请求 然后在每个线程中执行了 receivevfrom 我正在从各种套接字中的 IP 获取消
  • 对嵌套属性使用 XmlAttributeOverrides

    我试图使用 XmlAttributeOverrides 来控制类序列化后哪些类属性出现在 xml 中 它适用于 根 类上的属性 但不适用于嵌套属性 这是一个简单的例子来说明我想要完成的任务 我的类层次结构如下 public class Ma
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 所有区域的启用保护模式必须设置为相同的值(启用或禁用)

    我正在尝试使用Selenium Internet Explorer驱动程序 但当我尝试实例化它时它崩溃了 TestInitialize public void TestInitialise ieDriver new InternetExpl
  • 为 winforms ComboBox 中的单个项目着色?

    我遇到了一个困境 我有一个表单 其中包含许多组合框 其中包含在某些情况下可能无效 过时的信息 选项 项目 我不能简单地从项目中删除过时的信息 但我确实想在选项无效时为用户提供视觉线索 我正在考虑对项目进行着色 可能是红色 来指示它们是否无效
  • 在 C++11 中设置 std::thread 优先级的可移植方法

    在后 C 11 世界中设置 std thread 实例的优先级的正确方法是什么 是否有一种至少在 Windows 和 POSIX Linux 环境中有效的可移植方法 或者是获取句柄并使用可用于特定操作系统的任何本机调用的问题 无法通过 C

随机推荐

  • 更改ASP.net core 3.0中的身份登录URL

    我正在尝试更改默认登录 URL Identity Account Login to Login 我查过类似的问题 他们提出了与此类似的解决方案 public void ConfigureServices IServiceCollection
  • 流式传输 Android 屏幕

    我正在尝试休憩Truiton 屏幕捕捉 https github com Truiton ScreenCapture例如 为了记录设备屏幕使用媒体投影 https developer android com reference androi
  • SAS - 使用另一列中的值动态创建列名称

    我有一列包含许多从 XML 解析器解析的标志 数据如下 USERKEYED Y VALMATCH N DEVICEVERIFIED N EXCEPTION N USERREGISTRD N ASSOCIATE Y EXTERNAL N GR
  • 谁能发布一个如何在 Tsung 中启用 SSL 的示例?

    我正在使用 Tsung 从另一台计算机对 CouchDB 服务器进行负载测试 并且需要建立安全连接 不幸的是 我无法在文档或在线中找到语法示例 任何帮助将不胜感激 在 tsung xml 中
  • 如何让移动浏览器(iOS、Android 中的 webkit)显示其软键盘

    我正在编写一个小型 Web 应用程序 它大量使用 canvas 元素来执行类似于 VNC 的操作 它特别针对 iOS 和 Android 的默认浏览器 我可以通过 AJAX 调用检测何时需要键盘输入 但我无法说服移动浏览器按需显示其软键盘
  • 如何在 Azure Key Vault 中存储公共证书(.cer 文件)

    如何在 azure keyvault 中上传或存储公钥 cer 文件 当我尝试上传适用于 pfx 文件的任何 cer 文件时 从 keyvault 面板中会出现错误 您应该考虑 Key Vault 是否适合您的场景 公钥 本质上 不是机密数
  • cscope支持历史列表记录吗?

    I use C要获取一个函数的调用者 那么我可以按一个数字跳转到一个调用者 但如果我想跳到另一个来电者 我必须按跳回 再按C 即可获取来电列表 cscope支持历史列表记录吗 如果您使用VIM 可以尝试快速修复 se cscopequick
  • Haskell 中的“约束”是什么意思

    我对 Haskell 很陌生 我正在尝试通过编写一些代码来理解该语言 我只熟悉 ghci 上非常简单的指令 head tail sum 等 非常简单 我试图创建的函数是为了求解任意维向量的毕达哥拉斯定理 这看起来像这样 平方根 a 2 b
  • 词法作用域是如何实现的? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 几年前 我开始为一种小型领域特定语言编写解释器 其中包括程序员定义的函数 起初 我使用简单的符号表堆栈
  • 词集中词的最大交集算法

    背后的故事 我正在使用创建语音控制应用程序x webkit speech这是令人惊讶的好 功能 而不是我的应用程序 但有时用户 我 会有点咕哝 如果单词的某些合理部分与某些合理命令的某些合理部分相匹配 那么接受该命令会很好 所以我寻找名为
  • Numpy 提取子矩阵

    我是新来的numpy我很难理解如何从np array具有定义的列和行的子矩阵 Y np arange 16 reshape 4 4 如果我想提取列 行 0 和 3 我应该 0 3 12 15 我尝试了所有的重塑功能 但不知道如何做到这一点
  • 在没有准备好的语句/SQLite/C++ 的情况下防止 SQL 注入

    我希望得到一些有关此方案针对 SQL 注入攻击的安全性的反馈 在前端 用户输入个人信息 姓名 地址 电话号码 电子邮件和一些自由格式文本 后端是用C 从头开始编码的 没有框架支持 并集成了SQLite C 代码是这样的not使用 SQLit
  • 简单易懂的 Spring 应用程序登录

    我对 Spring 很陌生 今天才开始学习 我一直在寻找一个简单的登录应用程序 它也将解释 Spring 之外的应用程序的流程 当我用谷歌搜索时 我真的找不到其中的几个 http viralpatel net blogs tutorial
  • 将行号添加到 SQL 查询的结果集中

    我有一个简单的选择语句 我想添加一个临时列来表示结果集中的行数 我尝试过这个 declare num int set num 0 select t A t B t C count 1 as number from tableZ as t 它
  • 如何使用 LocationCollection 缩放以适应 WP7 Bing Maps 控件?

    如何在 Windows Phone 7 上将 Microsoft Phone Controls Maps Map 控件缩放到正确的缩放级别 我有一个地理坐标的 LocationCollection 并且我自己计算了中心 但现在如何计算正确的
  • EntityFramework连接问题

    我在 Visual Studio 2008 中有一个包含 3 个项目的解决方案 1 个 Web 应用程序和 2 个类库 实体框架模型位于类库中 起始项目是 Web 应用程序 我曾经遇到过这样的问题 在配置中找不到指定的命名连接 不适合与 E
  • 为什么 use 块不能安全地初始化 var?

    为什么这会出现编译错误 val autoClosable MyAutoClosable var myVar MyType autoClosable use myVar it foo println myVar Error Variable
  • 从两个表中选择单独的行,按日期排序

    I don t想要任何一种JOIN这里 我正在使用 PHP 构建两个表的 RSS 提要 并且我想从两个表中选择所有行 保持行分开 但按公共排序created column 例如 如果我有一张桌子foo id downloads views
  • Windows 中的 cmake 问题

    我正在尝试编译这个 相当复杂 在 Windows 中使用 cmake 和 MinGW 的一段代码 include
  • 可能的堆栈损坏

    参考我之前的问题GDB 未精确定位 SIGSEGV 点 https stackoverflow com q 3971091 191776 我的线程代码如下 void runner void unused do sem wait x if c