나는 synergy-project.org의 오래된 버전 (1.3.4)을 Solaris Studio 12.4에 설치했다. 이 프로그램에는 인수를위한 포인터로 함수가 호출되는 곳이 두 곳 있으며, 포인터가 길에 맹 글링됩니다. -m64에서 컴파일 및 링크. 내가 깃발을 만들 때 무엇을 볼 수 있습니까? 또는 다른 이유가 이것이 왜곡입니다. 아래 로그에서 프로그램이 잘못된 포인터를 보는 함수 안에서 중단됩니다.C++은 LP64에서 나와 포인터 값을 변경하는 참조로 전달합니다. 내가 뭘 봐야하니?
(dbx) print &event
&event = 0x948d30
(dbx) up
Current function is TMethodEventJob<CXWindowsScreen>::run
66 (m_object->*m_method)(event, m_arg);
(dbx) print &event
&event = 0xffff80f8be958a60
(dbx) down
(dbx) print event
event = {
m_type = 7354752U
m_target = 0x7091a0
m_data = 0x7036a0
m_flags = 6257120U
}
(dbx) up
Current function is TMethodEventJob<CXWindowsScreen>::run
66 (m_object->*m_method)(event, m_arg);
(dbx) print event
event = {
m_type = 2U
m_target = 0x94ee80
m_data = 0xc838b0d68
m_flags = 0
}
코드 :
void
CClientProxy1_0::handleData(const CEvent&, void*)
{
// handle messages until there are no more. first read message code.
UInt8 code[4];
UInt32 n = getStream()->read(code, 4);
while (n != 0) {
// verify we got an entire code
if (n != 4) {
LOG((CLOG_ERR "incomplete message from \"%s\": %d bytes", getName().c_str(), n));
disconnect();
return;
}
// parse message
LOG((CLOG_DEBUG2 "msg from \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3]));
if (!(this->*m_parser)(code)) {
... m_parser가 해결합니다 그것은 ("가"스택의) 부모가 올바른 데이터를했다입니다
bool
CClientProxy1_0::parseHandshakeMessage(const UInt8* code)
{
if (memcmp(code, kMsgCNoop, 4) == 0) {
// discard no-ops
LOG((CLOG_DEBUG2 "no-op from", getName().c_str()));
return true;
}
else if (memcmp(code, kMsgDInfo, 4) == 0) {
// future messages get parsed by parseMessage
m_parser = &CClientProxy1_0::parseMessage;
if (recvInfo()) {
EVENTQUEUE->addEvent(CEvent(getReadyEvent(), getEventTarget()));
addHeartbeatTimer();
return true;
}
}
return false;
}
}
.. comm 프로토콜이 이동할 때 m_parser가 어떻게 다시로드되는지 주목하십시오.
함수로 들어가는 것에 대한 대답은 함수에 입력 할 때 깨지므로 이며 곧 함수가 중단됩니다. "parseHandshakeMessage()를 handleData()에 하드 코딩하면 올바르게 작동하지만,이 함수는 포인터가 올바르게 작동하는 데 의존하는 다른 예제가 있습니다. 컴파일 플래그를 게시 할 수 있습니다. 중복되고 광범위합니다.
을 수 해당하는 C++ 코드 조각도 게시 하시겠습니까? 또한 인수가 실제로 초기화 된 시점에서 프로그램을 중지 했습니까? 아마도 호출 수신자 또는 첫 번째 줄을 넘어야 할 수도 있습니다. –
[MCVE] (http://stackoverflow.com/help/mcve)를 만드는 것이 최선의 방법입니다. 버그를 만들 수 없다면 (즉, 코드를 제거 할 때 버그가 사라집니다) 버그가 어디에서 왔는지에 대한 단서가됩니다. –