How would you approach to rectify a non-responsive application? - c++

Just now i was interviewed by ca(Computer Associates) for a C++ opening.
Q:There is an application that continuously runs for days.. at some day it becomes non-responsive/gets hanged.How would you Debug/rectify the application.What will be your first steps?
A:I answered starting with .. having a check on memory usage details/CPU usage..checking if some of the required resources are available...or if it is network bound,if the network is live..etc..
Q:He told.. these are all superficial things.. assume no such problem is there..then?
A:I told the best way is to check the debug logs if they are enabled..and if they arent..give the customer a debug enabled application and test it in the field.
Because the application is hanging intermittently..its very difficult to detect through any other way why it would go unresponsive..And debug logs would tell me at what instant the application starts to go mad,as to find the root cause the specific operation responsible needs to be known,and debug logs are what i think the best bet.
The interviewer switched to another question says .. ok fine.
So,was my answer good enough.Any other approach that a good programmer would follow?

Use WinDbg or create a (mini) dump file and load it up in your Visual Studio. Load debugging symbols for all the release binaries, and see exactly where it is hung
That should be a decent first step
Edit Of course I was (foolishly) assuming windows for no apparent reason. On UNIX/linux this would be even easier using strace, ptrace, gdb --remote, pstack, dtrace (if it's there) etc
Edit Also using WMI performance counters/perfmon is a very good practice in general. This would perhaps shed some light (but I'm sure the interviewer was looking for the 'How do I inspect a running application' type of answer; this is slightly leaning to the 'depend on logging' approach that you already had mentioned in your own answer)

Most of the times such questions cannot be answered to the point because they are very much subjective. They are usually asked to evaluate & judge how a potential candidate approaches a problem and shows some constructive approach of debugging the problem. As long as the answer shows some logical methodology of tackling the problem the answer is good.
Your answer was good. To add to it, Most important is to identify the use case/pattern where the problem occurs. If a problem is reproducble easily it is solvable. So I would try to define steps to reproduce the problem and then move ahead with steps to tackle it.

Related

Prevent piracy of desktop application which doesnt need Internet connection?

Suppose for an application which will never receive internet connection during its lifetime, how can you prevent the piracy of the software?
There cannot be a single product key requirement during installation because, once installed legitimately anybody can copy the installation and re-distribute it.
So every time the application runs it should check for something and crash if the check fails.
Now what could it possibly check?
Initially I thought keeping an encrypted binary file will do the job, but as answered here, that seems a negligible prevention.
Any hacker can modify the executable so that instead of crashing when the check fails it should continue running.
So no matter how difficult the check is, the cracked application will always run.
Now I cannot see any possible solution to this problem.
PS: I am a single independent developer who is developing productivity software with very low charge. Seeing this question I believe I just have to let it go. Sigh....
EDIT: I would like to thank all the contributors in this discussion in letting me know the grim reality...
What I understand now is that you are indirectly submitting the source code of your application in the form of the target executable. Its source code can be modified by anybody using a debugger, thus ANY method of preventing piracy through source code of your application is useless. The only possible solution to this problem is to keep your legitimate customers happy by providing them services (apart from the software) and keep your price below their expectations.
I was think of solving this problem for past 3 days and now all seems worthwhile but still learnt a lot in this process, which I wouldn't have otherwise...
I ha
The only standalone thing I've seen that is semi-effective is hardware keys that come with the boxed software. They used to attach to a parallel port or a serial port and get checked when you started the program.
AutoCad and similar programs used to do this, but it is a BIG PAIN for your customers. Any time it doesn't read it, or a key goes bad, customer productivity suffers. It hurts your legitimate customers far more than those who end up pirating it anyway, and a sufficiently motivated pirate can make a VM that will overcome this. Modern versions of this use USB.
My recommendation is to trust people. Upon install, make them click a "I promise I paid for this" button and be done with it. If they click "I didn't pay for this" show them a small paragraph about how to help keep good software coming and prevent customer-harming DRM schemes by simply contributing to the success of good software authors.
You could generate a unique copy for each user, create a database, and check it agents copies you find online if you like playing the biggest game of wack-a-mole ever.

WCF Webservice slow, find bottleneck

I'm briefly familiar with SvctraceViewer, but I'm not sure that is the right tool for this. Problem is, I'm trying to work with a rather large WCF app, not designed nor developed by me. Also, it is poorly documented.
Some of the views are running slowly, but - I have no idea why.
Is there any program that I can use to find out where the bottleneck is?
How many milliseconds a task takes before completing and so on?
Just use any profiler. There's nothing magical about WCF services which requires a special tool.
I have used both the built-in profiler in Visual Studio and also the dotTrace product from Jetbrains to accomplish this.
+1 to John Saunders - a profiler is the way to go to diagnose your problem. Ants Profiler is also excellent. I think you can get a 15 day free trial - might be long enough to identify your problem

Find out where application is hanging

Is there a way to figure out where an application is hanging and not completing its function? I opened the call stack but it is empty. What does this mean. Does anyone have any advice for debugging where an application was the moment it started to hang/become non responsive.
Edit: I am using Visual Studio 2010
When this happens to me, I find attaching the Very Sleepy profiler to the debugee often makes it easy to identify where the hang occurred, even if you attach it after it happened - just look for stackframes that were active for 100% of the profiler sampling session (by sorting the list by the "Inclusive %" column and looking at the top).
Compile your application with all warnings enabled and with the compiler producing debugging information. On Linux, that means g++ -Wall -g. Work on the source code till you got no more warnings. Learn to use a debugger (e.g. gdb on Linux), and use its step by step abilities.
But we can't help you more, because this is system dependent and you did not tell what system you are using and you did not show us the code you are debugging.
Read How To Debug Small Programs
In addition to using the debugger, run a profiler through the code. My VS is rather rusty, so I can't give details on how to do so, but google can help.
It would also help to have many small functions instead of few large ones, as the tightest granularity of the profile is function level.
Put log statements into the code. It is time consuming but some sort of divide and conquer approach should help you solve the problem.

Where is a good place for a code review?

A few colleagues and I created a simple packet capturing application based on libpcap, GTK+ and sqlite as a project for a Networks Engineering course at our university. While it (mostly) works, I am trying to improve my programming skills and would appreciate it if members of the community could look at what we've put together.
Is this a good place to ask for such a review? If not, what are good sites I can throw this question up on? The source code is hosted by Google Code (http://code.google.com/p/nbfm-sniffer) and an executable is available for download (Windows only, though it does compile on Linux and should compile on OS X Leopard as well provided one has gtk+ SDK installed).
Thanks, everyone!
-Carlos Nunez
UPDATE: Thanks for the great feedback, everyone. The code is completely open-source and modifiable (licensed under Apache License 2.0). I was hoping to get more holistic feedback, considering that my postings would still be very lengthy.
As sheepsimulator mentioned, GitHub is good. I would also recommend posting your project on SourceForge.net and/or FreshMeat.net. Both are active developer communities where people often peruse projects like yours. The best thing for your code would be if someone found it useful and decided to extend it. Then, you'd probably end up with plenty of bug fixes and constructive criticism.
You might get some mileage by posting the code out in the public space (through github or some other open-posting forum), putting a link here on SO, and seeing what happens.
You could also make it an open-source project, and see if people find it and use it.
Probably your best bet is to talk to your prof/classmates, find some professional programmers willing to devote their time, and have them review the code. Like American Idol-esque judging, but for your software...
As #Noah states, this is not the site for code review. You may present problems and what you did to overcome those problems, asking if a given solution would be the best.
I found a neat little website that might be what you are looking for: Cplusplus.com

What would you do if you coded a C++/OO cross-platform framework and realize its laying on your disk for too much due to no time?

This project started as a development platform because i wanted to be able to write games for mobile devices, but also being able to run and debug the code on my desktop machine too (ie, the EPOC device emulator was so bad): the platforms it currently supports are:
Window-desktop
WinCE
Symbian
iPhone
The architecture it's quite complete with 16bit 565 video framebuffer, blitters, basic raster ops, software pixel shaders, audio mixer with shaders (dsp fx), basic input, a simple virtual file system... although this thing is at it's first write and so there are places where some refactoring would be needed.
Everything has been abstracted away and the guiding principle are:
mostly clean code, as if it was a book to just be read
object-orientation, without sacrifying performances
mobile centric
The idea was to open source it, but without being able to manage it, i doubt the software itself would benefit from this move.. Nevertheless, i myself have learned a lot from unmaintained projects.
So, thanking you in advance for reading all this... really, what would you do?
Throw it up on an open source website and attach a bunch of good keywords to help search engines find it. If someone's looking for it, they'll find it and be able to use it.
I would say that you should open source it.
If you do have the time, it may be helpful for other programmers who are interested in the project to know the status of the project, and what is next to do on the project. Writing a to do list may be helpful, or writing comments in the code may also help.
If you do not have the time to write up a to do list maybe somebody is willing to take the initiative on the project, find out what needs to be done.
Look at it a different way. The worst that can happen is that your work will go unnoticed, and your efforts will be lost. The best that can happen is that you will be recognized for having the foresight to start such a great project, and open sourcing it.
http://sourceforge.net
This allows you to set up as admin and manage the project.
Of course if somebody does not agree with you they can fork the project and start their own version but that's open source for you.
If you've put time and effort into it, don't let it die a quiet death. Instead share it under the license of your choice on a collaborative site. At the worst, you get nothing in return. At the best, other people like the idea and provide constructive feedback or code. Even better is if you get some time in the future to pick it back up.
Couple of good sites to post it on
codeplex
sorceforge
Definitely, you should open source it, just make the same considerations you made on this question on a place that anybody can see...
Maybe someone will pick it up, or just learn from it
Put it up on github so we can all check it out.