【问题标题】:iOS app crashes on app termination with EXC_BAD_ACCESS on global/static variablesiOS 应用程序在应用程序终止时崩溃,并在全局/静态变量上使用 EXC_BAD_ACCESS
【发布时间】:2016-09-26 05:19:42
【问题描述】:

在我的 iOS 应用程序中,当应用程序终止时,我在 C/C++ 代码中使用的全局变量之一发生 EXC_BAD_ACCESS 崩溃。请注意,应用程序不会被置于后台,而是通过在 info plist 文件中指定不在后台运行而在关闭应用程序时终止。

下面是相关代码..

#include "chromium/threading/thread_local.h"
#include "libev/ev.c"

namespace simplegetter {


ThreadLocalPointer<ev_io> threadLocal_sock_watcher;
ThreadLocalPointer<ev_timer> threadLocal_timer;


void start_get (my_get_struct* get_struct) {

    ev_io* sock = new ev_io;
    ev_timer* temp_timer = new ev_timer;

    threadLocal_sock_watcher.Set(sock);
    threadLocal_timer.Set(temp_timer);

    //... other code.. 

}

void fire_again(my_get_struct* get_struct, uint32_t rtt) {
    double repeat = get_client_repeat_value(rtt);
    if (repeat < 0.5) repeat = 0.5;
    threadLocal_timer.Get()->repeat = repeat;
    get_struct->prev_timeout_finish_time = CURRENT_TIME_MS;
    ev_timer_again( threadLocalLoop.Get(), threadLocal_timer.Get());

    //.. other code
}

//... other code 

};

threadLocal_timer 是我说的全局变量start_get 方法在新线程上调用以获取网络资源。 fire_again 方法在调用 start_get 方法的线程上被多次调用,直到操作完成。

现在的问题是,在应用程序终止时(即当 iOS 在主线程上发送 exit() 调用时......(这是因为应用程序不应该保持挂起状态或在后台运行),iOS 似乎在这种情况下,将释放全局变量,即 threadLocal_timer,这会导致我的代码中的 EXC_BAD_ACCESS 崩溃:

threadLocal_timer.Get()->repeat = repeat;

因此,全局变量由 iOS 释放,然后线程在应用程序终止时停止。我的问题是,除了在上面的代码中根本不使用静态或全局变量之外,还有什么解决方案可以解决这个崩溃?

【问题讨论】:

  • 什么库,什么变量?抱歉,我们不是千里眼。
  • @SergeyA 这个 C/C++ 库是一个内部库,它本身在代码中有一些静态和全局变量。例如:ev_timer 就是一个这样的全局变量,在它上面会发生 EXC_BAD_ACCESS 崩溃
  • 不,不清楚。我们不知道你的图书馆里发生了什么。
  • @SergeyA 似乎我只是因为提到单独的 c/c++ 代码作为库而更加困惑。它只是应用程序中的纯代码,但我们只是将其单独维护。再次修改我的问题以消除混乱。
  • @SergeyA 刚刚发布了一些代码并重新格式化了问题。感谢您的建议。

标签: c++ ios global-variables


【解决方案1】:

你的问题太模糊了。

我编写的应用程序具有长期运行的后台进程,这些进程依赖于全球资源,就像您描述的那样。

我所做的是对全局后台任务计数。每次我启动这些长时间运行的任务时,我都会在主线程上调用一个函数来增加任务计数。

在长时间运行任务的关闭代码的最后,我调用另一个函数(在主线程上)递减计数器。)

在减少线程计数的代码中,如果计数为零,我将释放并清除我的全局资源。

使用该逻辑,在最后一个后台线程完成它们之前不会释放全局资源。

这样的方法可能会解决您的问题,但如果不了解更多信息,我无法更具体。

【讨论】:

  • 我已经编辑了我的问题并发布了相关代码。我的问题是 iOS 在停止使用这些变量的线程之前释放了我使用的全局变量。如果我仍然不清楚,请告诉我。感谢您的回答。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 2014-04-28
  • 2013-03-08
  • 2012-06-23
  • 2012-04-15
  • 1970-01-01
  • 2018-01-09
  • 2015-12-29
相关资源
最近更新 更多