关于指针的问题

T-Quake 2011-08-01 02:05:10
大家好,我最近在调试android的时候,在运行经过大概50小时的时间后,系统crash掉,提示是system_server挂了。
我反汇编了出错信息,定位到
这个个文件中AsynchronousSocketCloseMonitor.cpp
文件的具体代码可以访问http://code.google.com/p/in-the-box/source/browse/trunk/InTheBoxSim/libcore/luni/src/main/native/AsynchronousSocketCloseMonitor.cpp?r=38
的一句话

void AsynchronousSocketCloseMonitor::signalBlockedThreads(int fd) {
ScopedPthreadMutexLock lock(&blockedThreadListMutex);
for (AsynchronousSocketCloseMonitor* it = blockedThreadList; it != NULL; it = it->mNext) {
if (it->mFd == fd) { //这个地方有问题
pthread_kill(it->mThread, BLOCKED_THREAD_SIGNAL);
// Keep going, because there may be more than one thread...
}
}
}

汇编的代码到15ebc: 68e3 ldr r3, [r4, #12]
这个通过解释 是将r4的地址+12字节 放入到r3中,通过分析知道r4是结构体初始地址 +12过后是试图访问mFD成员变量,也就是, 函数在it->mFd的时候挂掉了,我不知道为什么。根据对代码的分析,看不出有逻辑不对的地方。而且如果是空指针的话,前面for循环也已经做了限制了。这个就很奇怪了。
...全文
175 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-08-04
  • 打赏
  • 举报
回复
数组越界如果调试器支持的话,可以在数组最后一个元素或最后一个元素的后面对应内存地址处设置内存改变断点。

Setting a Breakpoint When the Value at a Specified Memory Address Changes
To break when the value at a specified memory address changes

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the memory address for the byte.
For a word or doubleword memory address, enclose the address in parentheses, and precede it with a cast operator. For example, WO(21406036) for the word at memory location 21406036. Use the cast operator BY for a byte (optional), WO for a word, or DW for a doubleword. (The debugger interprets all integer constants as decimal unless they begin with zero (0) for octal or zero and x (0x) for hexadecimal.)

In the Number Of Elements text box, type the number of bytes, words, or doublewords to monitor. If you used the BY operator in the Expression field, specify the number of bytes. If you used WO, specify the number of words. If you used DW, specify the number of doublewords.


Click OK to set the breakpoint.

----------------------------------------------------------

Setting a Breakpoint When a Variable Changes Value
To set a breakpoint when a variable changes value

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the name of the variable.


Click OK to set the breakpoint.
T-Quake 2011-08-03
  • 打赏
  • 举报
回复
这个函数是个android标准的libcore的代码。走到这就挂了,我在怀疑是不是 因为在上次的某些其他的操作有数组越界。或者是因为别的进程有内存泄漏。。正在反复的试验。数组越界很难查看到,目前在跟 内存泄漏。
Dirk 2011-08-01
  • 打赏
  • 举报
回复
通常来说,这个是链表到问题。不是t为null,而是访问了不该访问到地方。你看看自己到数据结构,好好分析一下。
shijiemoxing 2011-08-01
  • 打赏
  • 举报
回复
学习下
赵4老师 2011-08-01
  • 打赏
  • 举报
回复
监视系统中所有socket对象、锁对象、各块已分配内存大小的变化。

检查是否内存泄漏的办法之一:
任务管理器 进程 查看 选择列 内存使用
任务管理器 进程 查看 选择列 虚拟内存大小
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上两个数值,再隔至少一小时,越长越好,比如一个月,再记录以上两个数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有内存泄漏!
G_8519 2011-08-01
  • 打赏
  • 举报
回复
最后一个节点的 it->mNext 确定是 NULL ?
至善者善之敌 2011-08-01
  • 打赏
  • 举报
回复
AsynchronousSocketCloseMonitor是用的链表存储?
hua_yang 2011-08-01
  • 打赏
  • 举报
回复
mark
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空指针究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的指针 288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66. 关于指向指针指针 368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧