Redian新闻
>
如何捕捉这种C++访问冲突
avatar
如何捕捉这种C++访问冲突# Programming - 葵花宝典
p*u
1
想邀请哥哥和侄子来旅游。但没有兄妹公证,我现在在美国,不知怎样办这个公证,没
有的话,光用照片行吗?
关于房产证,可以只带复印件吗?
下星期他们签证,这个星期办了一个银行存折, 不知道可不可以。多谢指教!
avatar
W*e
2
本人 07/31/2015 失业。刚拿到一Offer A, 工资有点低,并且需3天内决定是否接受
(下星期一),面试时公司A知道我失业并且知道我还有其它面试。今天刚参加完一个
新面试(现手上还有3个新Onsite面试), 对这个工作很感兴趣 (Offer B),工资应
该比在手的offer A 高许多,但 hiring manager 仍需一到二周内做决定,估计非常可
能拿到这个offer (Offer B).问 (1) 怎样同 Offer A hiring manager 谈判提高
工资并延迟offer决定?(2)怎样同offer B hiring manager 谈判加快offer决定?想
等好的新Offer B 但也不想失去在手的 Offer A。毕竟offer B 以及其它新offers 还
未到手,我是家里的饭票又不能有闪失。很纠结,急求帮助!谢了!
avatar
b*i
3
一个软件有很多回调,大多数时候我们使用智能指针.
我希望检查每个变量访问,就是说,当访问堆栈上的变量时,检查它是否在堆栈指针之上.
当这种情况发生时中断,而不是继续
如果继续,那么程序稍后会失败,但不会在发生第一次访问冲突的确切位置
avatar
p*r
4
我当年邀请姥爷过来也没有亲属公证,顺利通过了。房产证复印件就可以。
avatar
r*n
5
我觉得可以直接给B的HM说明情况,说自己特别适合而去想去如何的,但是现在有其他
offer需要马上答复,然后希望B能尽快有答复。
avatar
w*g
6
到底是堆还是栈?

上.

【在 b***i 的大作中提到】
: 一个软件有很多回调,大多数时候我们使用智能指针.
: 我希望检查每个变量访问,就是说,当访问堆栈上的变量时,检查它是否在堆栈指针之上.
: 当这种情况发生时中断,而不是继续
: 如果继续,那么程序稍后会失败,但不会在发生第一次访问冲突的确切位置

avatar
g*a
7
上周我妹去签, 顺利过了.没带任何公证. 我就是在给签证官的信上说明了一下兄妹关
系,然后把以前的老户口本带上了(上面有我们的名字),不过都没有看,简单问了几句就
过了
avatar
W*e
8
Thanks.

【在 r*****n 的大作中提到】
: 我觉得可以直接给B的HM说明情况,说自己特别适合而去想去如何的,但是现在有其他
: offer需要马上答复,然后希望B能尽快有答复。

avatar
b*i
9
stack

【在 w***g 的大作中提到】
: 到底是堆还是栈?
:
: 上.

avatar
m*t
10
如果你有把握失去了A后面还能有至少和A相当的offer,那就跟A讲如果他们加工资你就
去他们那里,不然就放弃。
同时跟B讲看能不能加快一下。以后的面试尽量不要提失业了



【在 W**********e 的大作中提到】
: 本人 07/31/2015 失业。刚拿到一Offer A, 工资有点低,并且需3天内决定是否接受
: (下星期一),面试时公司A知道我失业并且知道我还有其它面试。今天刚参加完一个
: 新面试(现手上还有3个新Onsite面试), 对这个工作很感兴趣 (Offer B),工资应
: 该比在手的offer A 高许多,但 hiring manager 仍需一到二周内做决定,估计非常可
: 能拿到这个offer (Offer B).问 (1) 怎样同 Offer A hiring manager 谈判提高
: 工资并延迟offer决定?(2)怎样同offer B hiring manager 谈判加快offer决定?想
: 等好的新Offer B 但也不想失去在手的 Offer A。毕竟offer B 以及其它新offers 还
: 未到手,我是家里的饭票又不能有闪失。很纠结,急求帮助!谢了!

avatar
w*g
11
这个似乎没有一个通用的办法。
Linux底下从/proc/self/maps可以读出所有mmap的内存区域。
这个应该包含了进程所有分配的内存。
每个线程的stack必然包含在其中的某一行。
stack是向低地址长的,每个stack前面如果有mmap内存的话,
属性必然是---p,用来在stack overflow的时候触发sigsegv。
这个可以用来做sanity check。
我能想出来的办法就是线程启动和结束的时候分别调用
你的回调函数。
启动的时候扫描/proc/self/maps,看那一段内存是本
线程的stack,记录到你的表格里。
结束的时候把对应的记录删除。
这样任意给一个指针,你就可以确定是不是包含在哪个
线程的stack里了。
如果没法/不愿意手工改程序,就可以用LD_PRELOAD大法了。
这个必须程序是动态链接的,然后用LD_PRELOAD
把pthread_create改成你自己的函数,然后由你来调用
标准的pthread_create。
退出的话有pthread_cleanup_xxx可以用。
我强烈不建议用这种黑魔法。能用标准C++和标准
软件工程的方法搞定最好。

【在 b***i 的大作中提到】
: stack
avatar
W*e
12

Thank you very much!

【在 m*****t 的大作中提到】
: 如果你有把握失去了A后面还能有至少和A相当的offer,那就跟A讲如果他们加工资你就
: 去他们那里,不然就放弃。
: 同时跟B讲看能不能加快一下。以后的面试尽量不要提失业了
:
: 受

avatar
x*u
13
作为老司机忠告你一句,C++1x的智能指针虽然强了点,但有更多巨坑
你这种喜欢回调的要坚决换语言,否则不是不报时候未到

上.

【在 b***i 的大作中提到】
: 一个软件有很多回调,大多数时候我们使用智能指针.
: 我希望检查每个变量访问,就是说,当访问堆栈上的变量时,检查它是否在堆栈指针之上.
: 当这种情况发生时中断,而不是继续
: 如果继续,那么程序稍后会失败,但不会在发生第一次访问冲突的确切位置

avatar
w*8
14
等B的Offer敲定了再拿去和A公司match,前段时间有个帖子就这样原公司给涨工资的。
但是如果你不是H1B不需要保身份的话就随兴好了,需要保身份的话先把A拿下,工资低
的话你跳B也更心安理得吧。如果B还没有一定拿到,因为A不愿意Match就把保身份的A
丢了,就尴尬了。
avatar
x*u
15
跑飞的栈指针很可能还是指向栈空间,无解啊

【在 w***g 的大作中提到】
: 这个似乎没有一个通用的办法。
: Linux底下从/proc/self/maps可以读出所有mmap的内存区域。
: 这个应该包含了进程所有分配的内存。
: 每个线程的stack必然包含在其中的某一行。
: stack是向低地址长的,每个stack前面如果有mmap内存的话,
: 属性必然是---p,用来在stack overflow的时候触发sigsegv。
: 这个可以用来做sanity check。
: 我能想出来的办法就是线程启动和结束的时候分别调用
: 你的回调函数。
: 启动的时候扫描/proc/self/maps,看那一段内存是本

avatar
W*e
16
谢谢。没有身份问题。问题是更想去B公司但还没拿到Offer

A

【在 w****8 的大作中提到】
: 等B的Offer敲定了再拿去和A公司match,前段时间有个帖子就这样原公司给涨工资的。
: 但是如果你不是H1B不需要保身份的话就随兴好了,需要保身份的话先把A拿下,工资低
: 的话你跳B也更心安理得吧。如果B还没有一定拿到,因为A不愿意Match就把保身份的A
: 丢了,就尴尬了。

avatar
w*g
17
智能指针我向来很谨慎不是很愿意用。
只有unique_ptr稍微舒服点。

【在 x****u 的大作中提到】
: 作为老司机忠告你一句,C++1x的智能指针虽然强了点,但有更多巨坑
: 你这种喜欢回调的要坚决换语言,否则不是不报时候未到
:
: 上.

avatar
M*s
18
别逗了,明摆着A想捡你个便宜,你去干吗?
avatar
m*p
19
可以嘗試用dynamoRIO控制所有內存訪問
avatar
x*u
20
如果用上多线程,lambda回调适当加几个动态module,基本上就是各种问题大集合了

【在 w***g 的大作中提到】
: 智能指针我向来很谨慎不是很愿意用。
: 只有unique_ptr稍微舒服点。

avatar
h*l
21
你是想说,当用一个智能指针访问栈上变量时,没有指向其他的内存类型比如mmap,
heap, bss 啥的? 如果是的话,你希望程序立刻crash, 而不是过一会在其它地方
crash?
你为什么需要用智能指针指向栈上变量啊?

上.

【在 b***i 的大作中提到】
: 一个软件有很多回调,大多数时候我们使用智能指针.
: 我希望检查每个变量访问,就是说,当访问堆栈上的变量时,检查它是否在堆栈指针之上.
: 当这种情况发生时中断,而不是继续
: 如果继续,那么程序稍后会失败,但不会在发生第一次访问冲突的确切位置

avatar
b*i
22
由于程序中大量使用[]callback,所以很可能栈上对象释放的次序和callback不对。
我希望这个callback 发生的时候它访问的地址和堆栈指针进行比较,如果越界则直接
死机让我看到哪里出了问题。我假定这一次原来会通过,所以会进行某种操作,影响某
个堆上的share_ptr的裸指针的计数。
这是我的猜测。因为我看到的是很多情况是某些类的析构函数调用的时候出现了Access
Violation。我看到访问的地址是几十兆偏移,而堆的地址在很高的位置。这里真正的
堆栈回卷时可能释放share_ptr被我捉住了,但是已经晚了,不是事故现场。光标停在
不同的析构函数的括号}那里。而这些类都有一些share_ptr。

【在 h**l 的大作中提到】
: 你是想说,当用一个智能指针访问栈上变量时,没有指向其他的内存类型比如mmap,
: heap, bss 啥的? 如果是的话,你希望程序立刻crash, 而不是过一会在其它地方
: crash?
: 你为什么需要用智能指针指向栈上变量啊?
:
: 上.

avatar
x*u
23
C++/1x就不适合玩callback,尤其是复杂多线程和回调环境下的
你真正需要的实际上是个gc指针,而这个在C++里做不到。
BTW,如果执意要做,不要capture引用,不要const_cast你capture的东西除非觉得生
活太平谈了

Access

【在 b***i 的大作中提到】
: 由于程序中大量使用[]callback,所以很可能栈上对象释放的次序和callback不对。
: 我希望这个callback 发生的时候它访问的地址和堆栈指针进行比较,如果越界则直接
: 死机让我看到哪里出了问题。我假定这一次原来会通过,所以会进行某种操作,影响某
: 个堆上的share_ptr的裸指针的计数。
: 这是我的猜测。因为我看到的是很多情况是某些类的析构函数调用的时候出现了Access
: Violation。我看到访问的地址是几十兆偏移,而堆的地址在很高的位置。这里真正的
: 堆栈回卷时可能释放share_ptr被我捉住了,但是已经晚了,不是事故现场。光标停在
: 不同的析构函数的括号}那里。而这些类都有一些share_ptr。

avatar
h*l
24
还是没看明白到底是一个什么样的情况,一般callback刚开始的时候可以用一个shared
_ptr存储接下来打算要用的变量,如果已经不valid了就赶紧撤了,啥也别干了。

Access

【在 b***i 的大作中提到】
: 由于程序中大量使用[]callback,所以很可能栈上对象释放的次序和callback不对。
: 我希望这个callback 发生的时候它访问的地址和堆栈指针进行比较,如果越界则直接
: 死机让我看到哪里出了问题。我假定这一次原来会通过,所以会进行某种操作,影响某
: 个堆上的share_ptr的裸指针的计数。
: 这是我的猜测。因为我看到的是很多情况是某些类的析构函数调用的时候出现了Access
: Violation。我看到访问的地址是几十兆偏移,而堆的地址在很高的位置。这里真正的
: 堆栈回卷时可能释放share_ptr被我捉住了,但是已经晚了,不是事故现场。光标停在
: 不同的析构函数的括号}那里。而这些类都有一些share_ptr。

avatar
w*g
25
这种需要valgrind以及楼上提到的那个软件吧。
valgrind就是太慢了。

由于程序中大量使用[]callback,所以很可能栈上对象释放的次序和callback不对。
我希望这个callback 发生的时候它访问的地址和堆栈指针进行比较,如果越界则直接
死机让我看到哪里出了问题。我假定这一次原来会通过,所以会进行某种操作,影响某
个堆上的share_ptr的裸指针的计数。
这是我的猜测。因为我看到的是很多情况是某些类的析构函数调用的时候出现了Access
Violation。我看到访问的地址是几十兆偏移,而堆的地址在很高的位置。这里真正的
堆栈回卷时可能释放share_ptr被我捉住了,但是已经晚了,不是事故现场。光标停在
不同的析构函数的括号}那里。而这些类都有一些share_ptr。

【在 b***i 的大作中提到】
: 由于程序中大量使用[]callback,所以很可能栈上对象释放的次序和callback不对。
: 我希望这个callback 发生的时候它访问的地址和堆栈指针进行比较,如果越界则直接
: 死机让我看到哪里出了问题。我假定这一次原来会通过,所以会进行某种操作,影响某
: 个堆上的share_ptr的裸指针的计数。
: 这是我的猜测。因为我看到的是很多情况是某些类的析构函数调用的时候出现了Access
: Violation。我看到访问的地址是几十兆偏移,而堆的地址在很高的位置。这里真正的
: 堆栈回卷时可能释放share_ptr被我捉住了,但是已经晚了,不是事故现场。光标停在
: 不同的析构函数的括号}那里。而这些类都有一些share_ptr。

avatar
T*i
26
不管你用啥语言,作死的途径有无穷多种。
正确的方法可能这辈子没人告诉你。
这里讨论的那些黑科技我大多都从来没用过。我个人认为,写代码,规矩很重要。制定
规矩最重要。
只要你系统里线程超过两个,同步问题只能看你设计的本事了。
我个人的经验,用shared_ptr唯一不作死的方法是:shared_ptr内容做成invariant的
;同时对shared_ptr的访问用一个mutex锁起来。你自己琢磨一下。。。

上.

【在 b***i 的大作中提到】
: 一个软件有很多回调,大多数时候我们使用智能指针.
: 我希望检查每个变量访问,就是说,当访问堆栈上的变量时,检查它是否在堆栈指针之上.
: 当这种情况发生时中断,而不是继续
: 如果继续,那么程序稍后会失败,但不会在发生第一次访问冲突的确切位置

avatar
m*p
27
用mutex的話這個ptr性能會死得很難看,64核處理器性能還不如4核。正確作法應該是
long atomic shared_ptr。

【在 T********i 的大作中提到】
: 不管你用啥语言,作死的途径有无穷多种。
: 正确的方法可能这辈子没人告诉你。
: 这里讨论的那些黑科技我大多都从来没用过。我个人认为,写代码,规矩很重要。制定
: 规矩最重要。
: 只要你系统里线程超过两个,同步问题只能看你设计的本事了。
: 我个人的经验,用shared_ptr唯一不作死的方法是:shared_ptr内容做成invariant的
: ;同时对shared_ptr的访问用一个mutex锁起来。你自己琢磨一下。。。
:
: 上.

avatar
T*i
28
我的原则,没有pin to core,不用atomic。
楼主的应用,远远没达到pin to core的级别。
shared_ptr,应有所有如下特点:
1. 生存期长
2. 大多数时候只读不写
3. 读数据时候操作时间复杂度较高。远远不是计数器那么简单。
因此,适合做成invariant。用mutex guard一下。
否则,想别的办法。根本别share了。

【在 m*****p 的大作中提到】
: 用mutex的話這個ptr性能會死得很難看,64核處理器性能還不如4核。正確作法應該是
: long atomic shared_ptr。

avatar
l*m
29
std::experimental::atomic_shared_ptr 已经进ISO C++

【在 m*****p 的大作中提到】
: 用mutex的話這個ptr性能會死得很難看,64核處理器性能還不如4核。正確作法應該是
: long atomic shared_ptr。

avatar
x*u
30
程序里原则上不应该写任何自己的mutex对象,mutex和裸指针一样有毒,要从架构上
lock free

【在 T********i 的大作中提到】
: 不管你用啥语言,作死的途径有无穷多种。
: 正确的方法可能这辈子没人告诉你。
: 这里讨论的那些黑科技我大多都从来没用过。我个人认为,写代码,规矩很重要。制定
: 规矩最重要。
: 只要你系统里线程超过两个,同步问题只能看你设计的本事了。
: 我个人的经验,用shared_ptr唯一不作死的方法是:shared_ptr内容做成invariant的
: ;同时对shared_ptr的访问用一个mutex锁起来。你自己琢磨一下。。。
:
: 上.

avatar
b*i
31
这个程序要读入一种资源文件目录,假定叫做House。两个版本读入House 0, 1, 2等资
源都没有问题。
现在,版本A读入House 100没有问题,但是后来的版本B读入House 100 有问题。在存
盘的时候,程序使用了多线程。B出问题的时候如果用VS调试,看到在一个Win32 API那
里出了问题。这个api需要一个wchar*作为参数。原来的程序使用C++11/14的std::
codecvt_utf8什么的转换。网上说这个微软的版本有问题。我给改成了简单的wstring(
..)方案,结果这里不死机了。但是换个地方死机。
我换不同的方案,比如换wchar[1024],就又换一个地方死机。死机就是说VS截获了
Access Violation,这个地方好几次都在析构函数最后的}那里。只有刚开始调试没有任
何修改的时候是在Win32API那里。这个API创建一个Process,然后通过
WaitSingleObject来等待这个进程结束。这个进程是有critical section保护的,只有
一个运行。其他线程只是把输出的数据做准备。
两个版本间有一个重大改变,号称为解决内存泄漏。一个基类有一个指针,指向上层数
据结构(比如文件的上层目录)叫up.版本A里面在各拷贝构造函数里面都把up赋值成另
一个对象的up。但是此人认为这可能会在拷贝构造的时候把一个临时对象指向的还在栈
里面的up赋值给堆上的对象做up,这样等栈回卷的时候,栈上的up消失了,但是堆上的
对象就指向错误的地址了
myobj(myobj& other):up(other.up){}此初始化列表被删掉,怕other.up是栈上的对象
,而this是堆上的。
但是这么一改,使得B反而出错了。当然,可能原来A版本问题被掩盖了。那么如何避免
把栈上的对象作为堆上对象的up成员呢?会不会真的有人把一个栈上的对象通过一个拷
贝构造或者转移构造给了堆上的对象?怎么在代码里找呢?有一百万行代码的说

上.

【在 b***i 的大作中提到】
: 一个软件有很多回调,大多数时候我们使用智能指针.
: 我希望检查每个变量访问,就是说,当访问堆栈上的变量时,检查它是否在堆栈指针之上.
: 当这种情况发生时中断,而不是继续
: 如果继续,那么程序稍后会失败,但不会在发生第一次访问冲突的确切位置

avatar
b*i
32
可否重载myobj::new?
设一个标志,isOnHeap=false,如果是new的,设true
可行吗?

wstring(

【在 b***i 的大作中提到】
: 这个程序要读入一种资源文件目录,假定叫做House。两个版本读入House 0, 1, 2等资
: 源都没有问题。
: 现在,版本A读入House 100没有问题,但是后来的版本B读入House 100 有问题。在存
: 盘的时候,程序使用了多线程。B出问题的时候如果用VS调试,看到在一个Win32 API那
: 里出了问题。这个api需要一个wchar*作为参数。原来的程序使用C++11/14的std::
: codecvt_utf8什么的转换。网上说这个微软的版本有问题。我给改成了简单的wstring(
: ..)方案,结果这里不死机了。但是换个地方死机。
: 我换不同的方案,比如换wchar[1024],就又换一个地方死机。死机就是说VS截获了
: Access Violation,这个地方好几次都在析构函数最后的}那里。只有刚开始调试没有任
: 何修改的时候是在Win32API那里。这个API创建一个Process,然后通过

avatar
T*i
33
单线程最安全,没毒,lock free。
话说多核大并发lock free的架构,这个版上几个人玩过?


: 程序里原则上不应该写任何自己的mutex对象,mutex和裸指针一样有毒,要从架
构上

: lock free



【在 x****u 的大作中提到】
: 程序里原则上不应该写任何自己的mutex对象,mutex和裸指针一样有毒,要从架构上
: lock free

avatar
T*i
34
你这个折腾法儿,肯定就错了。你看看stl怎样处理堆和栈的分配的?


: 可否重载myobj::new?

: 设一个标志,isOnHeap=false,如果是new的,设true

: 可行吗?

: wstring(



【在 b***i 的大作中提到】
: 可否重载myobj::new?
: 设一个标志,isOnHeap=false,如果是new的,设true
: 可行吗?
:
: wstring(

avatar
h*l
35
up是不是shared_ptr? 基类的构造函数,拷贝构造函数,析构函数对up是怎么处理的?
你这种情况up一定要指向堆上内存。应该只要在构造对象的时候分配堆内存给up赋值
就可以了。不会出错的,而且应该很好找啊,和程序行数没啥关系,难道你用的IDE不
能search string,记事本都可以啊。
个人感觉你们B版本的改动是不对的。你同事试图解决的也不是内存泄漏问题。当然你
们后来出现的问题也不是死机。:) 可能最大的问题是最开始写那个基类的人走了,你
同事又不太懂。。。

wstring(

【在 b***i 的大作中提到】
: 这个程序要读入一种资源文件目录,假定叫做House。两个版本读入House 0, 1, 2等资
: 源都没有问题。
: 现在,版本A读入House 100没有问题,但是后来的版本B读入House 100 有问题。在存
: 盘的时候,程序使用了多线程。B出问题的时候如果用VS调试,看到在一个Win32 API那
: 里出了问题。这个api需要一个wchar*作为参数。原来的程序使用C++11/14的std::
: codecvt_utf8什么的转换。网上说这个微软的版本有问题。我给改成了简单的wstring(
: ..)方案,结果这里不死机了。但是换个地方死机。
: 我换不同的方案,比如换wchar[1024],就又换一个地方死机。死机就是说VS截获了
: Access Violation,这个地方好几次都在析构函数最后的}那里。只有刚开始调试没有任
: 何修改的时候是在Win32API那里。这个API创建一个Process,然后通过

avatar
m*p
36
我現在就在測試這個東西的性能,坑很深,硬件強相關
看看linux kernel從3.0開始的很多改動,e.g. lockref,全部是把mutex換成lockfree
long。
軟件如mysql,對spinlock做了好多優化。
library如c++17/c++20,正在做concurrent/parallel/reentrant optimized & safe。

【在 T********i 的大作中提到】
: 单线程最安全,没毒,lock free。
: 话说多核大并发lock free的架构,这个版上几个人玩过?
:
:
: 程序里原则上不应该写任何自己的mutex对象,mutex和裸指针一样有毒,要从架
: 构上
:
: lock free
:

avatar
l*s
37
new都是在堆上分配的,你这么干没意义。

【在 b***i 的大作中提到】
: 可否重载myobj::new?
: 设一个标志,isOnHeap=false,如果是new的,设true
: 可行吗?
:
: wstring(

avatar
u*t
38
Have you ever tried address-santizer?
If you really want to get stack frame pointer, try getcontext()
avatar
r*w
39
用C++最妥当的方法就是把它当C语言+加类+虚函数,最多再用用stl。
如果实在觉得离不开C++里面的各种聪明轮子,那还是直接上golang妥当。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。