A lady in trouble //Visual C++

31 отговора 1745 прегледа
#1

A lady in trouble //Visual C++

Здравейте.
Забатачих се с едно проблемче и идея си нямам какво да го правя.
ИЗползвам, значи, COM-Object, писан от друг и правя обръщение към негов метод. В релийс мод всичко е ок, в дебъг също, до момента, в който се опитам да вляза в някой от методите на въпросния обект (вкл. конструктора). В този момент в стека престава да има каквото и да било! Пълно замазване!
Какво да го правя това? НАправо откачам. Какво ли не пробвах! И от къде накъде гадта ще си бачка, като я подминавам с Ф10, а при Ф11 ще закусва със стека ми? С моят хубав, любим стек!
А аз явно съм малка и тъпа, щото ми се еба майката и така и не разбрах къде може да е проблема...Всъщност имам едно предположение(Възможно ли е намесата на MFC да оплескава нещата?) Но дори и да е така, какво , да го еба, трябва да направя, за да го оправя?
Помогнете, моля ви!
Your my only hope!

I sometime fancy myself an evil which exists to oppose other evils.
Отговор
в отговор на lady Marian #2

Hey, ladies don't swear (that much :) )

Hi,
Imash li w kontrolata niakakaw prilogen source, i izobsto kakwo tochno predstawliawa tazi kontrola za COM ports?

Отговор
в отговор на Winnetou #3

Opaa pogreshno sam prochel :) )

Opaa - razbrah che control-a e COM i e za COM port. Wsastnost poslednoto ne e taka :)). No towa ne promenia waprosa de :))
Izwiniawaj!

Отговор
в отговор на lady Marian #4

Re: A lady in trouble //Visual C++

като разчистим сексуалните конотации, остават известни неясноти по ситуацията за която става дума.

предполагам, че COM обекта към който правиш обръщение е с налични debug symbols (и VC-то си load-ва) и е in-proc сървър (dll).

COM сървъри правени с MFC (както и VB)- export-ват всичко през IDispatch, въпреки всички препоръки на MS за dual interface. Така че когато викаш метод на такъв COM :
1. ако твоят код е с MFC - ще преминеш през stub-a направен от wizard-a, после през InvokeHelper() - който да bind-не параметрите според изискванията на IDispatch
2. от отсрещаната страна - MFC-то реализира IDispatch::Invoke - за да unbind-не параметрите и да ги подаде към нормалната функция която вече е със съответните параметри и прави там каквото трябва.

стека се замазва защото просто вградения в IDE-то на VC debugger не е толкова умен, да вземе debug символите на Windows-a (ако изобщо ги имаш на машината), а и да ги взема - пак му нямам доверие... да не говорим че ако COM обекта беше out-of-process, картинката е наистина смразяваща (който е debug-вал например COM комуникацията IE <-> MS Word Viewer знае).

ако debug-ваш да disassembler View - с малко внимание винаги ще достигнеш до метода който ти трябва (при in-proc server разбира се.)

обезпокоително е това което казваш за конструктора - че искаш да влезеш в него. конструктор-ът на C++ класа който реализира COM обекта не се вика пряко от клиентското приложение, а чрез CoCreateInstance (или IClassFactory->CreateInstance) и голямо трасиране ще падне (CoCreateInstance е в OLE32.dll и там се почва едно такова четене на registry) докато се добереш до него.

IMHO най-добрият вариант е да слагаш breakpoint-и където искаш.
примерно:
твоят код:
ред 20: CoCreateInstance()
ред 21: нещо си.
като стигнеш до ред 20 - слагаш breakpoint в конструктора на класа реализираш COM обекта и даваш Ф5. - ще те break в конструктора като излезеш от там връщаш се в твоя код и даваш Run to Cursor (слагаш курсора на ред 21.)
при викане на метод - пак по същия начин.

Отговор
в отговор на _ #5

Re: A lady in trouble //Visual C++

Abe piTch i si super typ. Radwam se che hora kato tebe otgowarqt na kretenoidnit e wyprosi na psewdo zeni. Zashoto ako tozi koito e pusnal postinga ne e 100% myz nai-malkoto e travestit. Sega shte ti obqsnq cqlata kartinka - kakwo predstawlqwash ti:

1. Ti imash begla predstawa kakwo e OOP no weche se zanimawsh s COM. Ne znam ot kyde idwad slaboumnite ti izwodi che wseki COM syrvyr ima IDispatch. Oswen towa spomenawsh abstraktni neshta kato "dual interfaces" i nameswash VB bez da e nuzno za da syzdadesh respect. Abe s mnogo dumi - adski prozzz.

2. Dokato si pisal teksta si se wyzhishtawal na terminite koito izpolzwash i logikata neshto kuca ...

3. Obache ot wsichko nai-mnogo me kefi obqsnenieto ti za breakpointite. Qwno skoro si chel kak se izpolzwa funkciqta Run To Cursor. Ti si NUMBER ONE !!!

A za travestita - ima si specialna sekciq w MSDN za towa kak se debugwat COM syrvyri. Probwai da q prochetesh oswen wsicko drugo koeto si probwal...

Отговор
в отговор на goshomir #6

Re: A lady in trouble //Visual C++

споменах само че сървърите създадени с MFC и VB винаги export-ват единствено през IDispatch, поради което не се отзоваваш веднага в кода на фунцията реализираща каквото-там-трябва.

по отношение на breakpoint-ите не виждам какво неуместно съм казал - това си е нормален начин да се прескачат евентуалните layer-и които стоят между клиент и сървър - в случая MFC-то от сървърска страна.

Отговор
в отговор на lady Marian #7

Re: A lady in trouble //Visual C++

Не разбирам какъв ти е проблема. Нали така или иначе всичко си работи. До конструктора пък въобще не би трябвало да имаш пряк достъп, щото за него се грижи Class Factory-то на обекта. А ако наистина искаш да видиш какво става със стека, и.т.н. натискаш alt-8 във VC++ дебъгера и "копаеш от онази ограда до утре".

Отговор
в отговор на Penguin #8

Re: A lady in trouble //Visual C++

Penguin a q samo poqwsni kakwo znachi che za "konstruktura se grizi klas faktorito na obekta" !? Kakwo si imal w predwid

p.s. Az ne razbiram ot COM....

Отговор
#9

Re: A lady in trouble //Visual C++

kakvo znachi drug klient da go startira? ako tova e .dll, niama da ima nikakvi posledstvia

Пламен
Отговор
в отговор на lady Marian #10

Re: A lady in trouble //Visual C++

Така, като начало - на уважаемият господин, който ме нарече "травестит", много мерси, но ако наистина му се заяжда, има много по-подходящи места за това, моля да заповяда. Жена съм си и не виждам къде му е проблема.

А моят проблем е много сериозен и съвсем сериозно търся решение.
Сега, като прочетох пак, забелязвам, че не съм обяснила много точно.
Ситуацията е следната: Имаше готов COM Objekt. Един от мембърите му беше обект от клас, който трябваше да бъде заменен. Моята задача беше да напиша нов клас, който да замени старият така, че отвън разликата да не личи. При тестовете всичко беше наред, докато в един момент не се опитах да дебъгна моят си модул, за което трябваше да се мине през другият клас.
Всъщност проблемите с дебъга се появиха когато се опитах да сложа брейкпойнт в началото на функцията, в която се опитах да вляза. След тва я махнах, но проблема остана.
Вижте, аз нямам много опит в програмирането, такак де, още се уча и в никакъв случай не претендирам за кой знае какви познания. За това и питам. Ако знаех всичко, нямаше да питам, нали така?
Не се заяждайте, а ми помогнете, моля ви!

I sometime fancy myself an evil which exists to oppose other evils.
Отговор
в отговор на lady Marian #11

Re: A lady in trouble //Visual C++

pak ne si mnogo iasna.
tozi gotovia com object imate li mu sorsa, shtoto ako go niamate otkade izobshto znaesh che toi imal niakakav member, da ne govorime che com objectite niamat memberi, a eventualno klasa s koito sa implementirani (ako izobshto sa implementirani s klas) mozhe da ima, no ti ako go niamash sorsa tova izobshto ne mozesh da go znaesh.
ne misli che se zaiazdam, prosto ne mi se vrazvat neshtata

Пламен
Отговор
#12

:)

аз ли неясно не изразявам, или ти така ме четеш. :)
писах - "сървърите създадени с MFC и VB export-ват през IDispatch", това не е същото като "всички COM сървъри", затова беше и забележката ми за dual interface-то.

предложението да се сложи breakpoint на CoCreateInstance и на конструктора е продиктувано от потребността на девойката да гледа стека. Ако сложи breakpoint само в конструктора няма да знае откъде в клиентската приложение е извикан CoCreateInstance-то (още повече че може да е на много места) - и съответно накъде ще продължи кода след създаването на обекта (изхода от конструктора).

a MFC-то - автоматично ти създава class factory за COM обекта - ето един layer, също unbind-ването на параметрите от IDispatch::Invoke за да се подадат към твоята функция - друг layer.

ако съм изпаднал в обидни за интелекта подробности то е, защото предпочитам да съм сигурен, че съм бил достатъчно ясен и за да бъдат избегнати предълги последващи постинги с уточнения.

Отговор
в отговор на _ #13

Re: :)

lelelel ohhh smeshno mi e da sporq s tebe.....

"сървърите създадени с MFC и VB export-ват през IDispatch" ima ideqta na neshto PO PRINCIP!! Osyznai se ili prosto ne znaesh dobre bylgarski? A neshto po princip oznachawa "powcheto->wsichki"!!
Dori i ti da se izrazqwash taka ne moga da razbera zashto nameswash IDispatch sled kato tq ne e utocnqwala dali towa e Automation Com server. ILi prosto ti taka mezdu drugoto dokato otgowarqsh na neiniqt posting wmetwash po neshto ot sebe si s obrazowatelna cel?

"a MFC-то - автоматично ти създава class factory за COM обекта - ето един layer, също unbind-ването на параметрите от IDispatch::Invoke за да се подадат към твоята функция - друг layer. " - BEZ KOMETAR!

Kato ostawim nastrana towa che izrechenieto:
"предложението да се сложи breakpoint на CoCreateInstance и на конструктора е продиктувано от потребността на девойката да гледа стека. Ако сложи breakpoint само в конструктора няма да знае откъде в клиентската приложение е извикан CoCreateInstance-то (още повече че може да е на много места) - и съответно накъде ще продължи кода след създаването на обекта (изхода от конструктора).
"
e dosta netochno(procheti go nqkolko pyti i shte razberesh - sywet "Wiz kakwo si pisal za CoCreateInstance i breakpointite i posle towa che nqma da znae ot kyde se izwikwa CoCreateInstance "), towa za steka e absolutna glupost... Visual Studio deistwa taka - ako ne si otworil prozoreca Watch predi da e stignalo do breakpointa nqma da ti pokaze steka inache go pokazwa... Abe ne mi se spori s tebe - towa e posledniq mi posting tuk koito e prednaznachen za tebe.

Отговор
в отговор на goshomir #14

Re: :)

Opa izpusnah da dobawq (poneze otidoh da gledam sladko otmyshtenie :))...
Abe chudq se ot kye da zapochna. Samo iskam da te popitam ti mezdu CoCreateInstance i konstruktura na obekta kojto syzdawash s nego imash li nqkakwi izwikwaniq!? Pitam wyw wryzka s towa che breakpointa trqbwalo da byde tochno predi twoqt CoCreateInstance i chak togawa da slozish breakpoint w konstruktura na obekta. Kakwo mozesh da widish powehe w quickwatcha togawa... Abe prosto pishesh absolutni gluposti ne znam kak ne go osyznawash... A i oswen towa momicheto zadawa tochen wypros a ti wlizas w podrobnosti za towa che CoCreateInstance moze da se izwikwa nqkolko pyti w neiniqt kod za nejniqt obekt abe prosto ti si dyrwen filosof... Kakto kazah ne znam ot kyde da zapochna.. A tuk trqbwashe da prodylza s biseryt ti za towa che ako programata stiga do breakpointa w konstruktura ot drug CoCreateInstance a ne ot twoq ti si mozel da se zabludish ot steka i posledwaloto izpylnenie na programata i t.n. i t.n.
Pone ne pishi gluposti ako ne iskash da si priznaesh che si sbyrkal - nqma nishto losho wsichki burkame (ti nai mnogo)

Отговор
в отговор на goshomir #15

:)!

>>
"сървърите създадени с MFC и VB export-ват през IDispatch" ima ideqta na neshto PO PRINCIP!! Osyznai se ili prosto ne znaesh dobre bylgarski? A neshto po princip oznachawa "powcheto->wsichki"!!
<<

тъй като девойката каза че е намесено MFC - затова споменах за IDispatch и оттам съответно и за stub-овете между клиентската и сървърската част която реализира действителните функции.
а за да създадеш COM сървър не е задължително за ползваш MFC или VB, нали?

под "стек" мисля, че първо се разбира редът от вложени извиквания на функции... Като казва, че и се губи стека разбирам, че прозореца "Call Stack" не и показва достоверна информация - тоест коя функция коя е извикала.
чак след това идват евентуално локалните променливи за всеки stack frame.

ако девойката под "стек" е имала нещо друго предвид - значи имаме разминаване в терминологията.


някой от другите участници във форума да се наеме с ролята на арбитър.. ?все пак струва ми се, разбираемо е желанието ми да установя, дали пък моят начин на изразяване е толкова неясен и оплетен, че да предизвиква такива реакции.. - (за първи път ми се случва откакто пост-вам в този форум).
обещавам, че ще работя върху стила си...

Отговор
в отговор на _ #16

Ivane kazhi si, shte ti olekne...

Sled kratko obsuzhdane s kolegite po vreme na izvanrednoto zasedanie, koeto provedohme po povod dostignalite do nas signali za citiram, "shiteshtata se nadlizh i nashir nekompetentnost, prediodi4no prekusvana ot izblici na kretenoidno goloslovie" predizvikvani nai-ve4e ot avtorat "dolno tire/4erta", vzehme reshenie:

"(за първи път ми се случва откакто пост-вам в този форум). " - pozhelavame na kolegata da mu e za posleden put, no tui kato edinstveniat na4in tova da se osashtestvi e toi ve4e da ne post-va, preporu4vame toi da se vurdurzha do spodelia maloumnite si komentari predi da gi e obsudil sus svoia psihoanalitik, pri nespazvane na zapovedta mozhe da se stigne do amputacia na gornite krainici.

Zakliu4enie: sustavat edinodushno reshi, 4e triabva da se dade malko vreme (proben srok) na avtorat (dolno tire/4erta) prez, koeto toi da poumnee, za da razbere v posledstvie, kolko e tup.

This is my courthouse and right now, right here I'm the law!!!

Отговор
в отговор на Arbitar #17

Re: Ivane kazhi si, shte ti olekne...

Mnogo radikalno beshe ornoto mnenie i az ne sym syglasen s nego....
No pak te pitam zashto kogato tq e kazala che e nameseno MFC ti spomenawash IDispatch?! Otgowori mi na tozi wypors molq!

Отговор
в отговор на lady Marian #18

EGATI

VIDIAHTE ZHENA VAV FORUMA I VEDNAGA POCHNAHTE DA SI MERITE PISHKITE

Отговор
в отговор на zzzzzzzz #19

Аз не съм я видял,

ама и на мен ми е интересно. Стават такива работи. Ти къде я видя? Става ли, или е "Жена-програмист"?

Отговор
в отговор на Colombino #20

Re: Аз не съм я видял,

Нали знаеш вица за жената програмист и морското свинче...

Целта оправдава средствата
Отговор