Recently I had such symptom - it went away when I turned "Whole Program Optimization" off


On Tue, Jan 28, 2014 at 11:33 AM, Peter Armbrüster <arm@rfh-koeln.de> wrote:

Dear Boost.python, C++ and Py++ Experts,

 

this is my first post in your excellent Forum.

 

I have chosen as the wrapper software the boost.python/Py++ Package to write a physx 3.x Wrapper, because I think it is the best.

Many many thanks to David Abrahams and Roman Yakovenko for the great Tools.

 

The wrapping of old versions physx 2.x had made no problems.

And now I come across a  very big problem at the 3.x Versions.

All wrappings of classes works very well.

The problem only exists in the PhysX free functions, which are responsible for the initialization of PhysX.

 

I try to explain with a reduced Example.

The initialization of PhysX starts with create of foundation :

 

0 static PxFoundation *mFoundation = NULL;

1 static PxDefaultErrorCallback gDefaultErrorCallback;
2 static PxDefaultAllocator gDefaultAllocatorCallback;
3 mFoundation = PxCreateFoundation(PX_PHYSICS_VERSION, gDefaultAllocatorCallback, gDefaultErrorCallback); 4
4 if(!mFoundation)

5   fatalError("PxCreateFoundation failed!");

 

The wrapped python program generate a runtime error at line 3: RuntimeError: Access violation - no RTTI data!

Its impossible to get mFoundation.

 

 

 

Notes:

- physx comes as SDK:  only Headers, libs and dlls.

- PxFoundation is a Abstract class:

 

class PX_FOUNDATION_API PxFoundation
{
public:
   virtual   void release() = 0;
   virtual PxErrorCallback& getErrorCallback() const = 0;
   virtual void setErrorLevel(PxErrorCode::Enum mask = PxErrorCode::eMASK_ALL) = 0;
   virtual PxErrorCode::Enum getErrorLevel() const = 0;
   virtual PxBroadcastingAllocator& getAllocator() const = 0;
   virtual PxAllocatorCallback& getAllocatorCallback() const = 0;
   virtual bool getReportAllocationNames() const = 0;
   virtual void setReportAllocationNames(bool value) = 0;

   virtual ~PxFoundation() {}
};

 

- The wrapping of PxFoundation makes no problem.

 

 

To make sure that I made no mistake with the  initialization of PhysX, I tried a different solution.

A small function InitPhysX create the foundation, and  GetFoundation get this.

 

C++ Code:


using namespace physx;

PxU32
PHYSICS_VERSION = PX_PHYSICS_VERSION; 
static PxFoundation *mFoundation = NULL;
static PxDefaultErrorCallback gDefaultErrorCallback;
static PxDefaultAllocator gDefaultAllocatorCallback;


PxFoundation*
GetFoundation(){
   return mFoundation;
}

void InitPhysX() {
   mFoundation = PxCreateFoundation(
      PX_PHYSICS_VERSION,
      gDefaultAllocatorCallback,
      gDefaultErrorCallback);

   if(!mFoundation)
      printf("ERROR: PxCreateFoundation failed!\n");

   else
      printf("PxCreateFoundation created!\n");
}

 

The wrapped python program:

 

1 import _physx324_d as PX

2 PX.InitPhysX()

3 foundation = PX.GetFoundation()

 

I get on line 2 the message: "PxCreateFoundation created!"
=> OK!

 

On Line 3 the same error RuntimeError: Access violation - no RTTI data!

 

Now i check the wrappings of PxCreateFoundation in  _physx324_d_free_functions.pypp.cpp

 

void register_free_functions(){

    . . .

 

    { //::GetFoundation
   
        typedef ::physx::PxFoundation * ( *GetFoundation_function_type )(  );
       
        bp::def(
            "GetFoundation"
            , GetFoundation_function_type( &::GetFoundation )
            , bp::return_value_policy< bp::reference_existing_object >() );
   
    }

 

    . . .

 

 

I think: return_value_policy< bp::reference_existing_object > thats right!?

 

Then a debug session with PTVS, start with a break point in InitPhysX

and inspect the mFoundation after the successful generation.

Its a vptr with 9 Entries => thats right, PxFoundation has 9 Methods.

That's all what I can see, because I have no source code and no pdb (symbols).

 

I place the next Breakpoint in

PxFoundation* GetFoundation(){
   return mFoundation;
}

 

to search the Error location.

 

Then followed a trace trip through the code, for me is a journey through an unreadable jungles of wrapper C + + code.

Unfortunately, I am not an C++Expert.

The Error is not to find for me.

 

 

The same problem occurs with PxCreatePhysics.

 

My work enviroment:

·  Windows 7 x64

·  Python 2.7

·  physxVersion 3.24  (i try: 3.01, 3.23, 3.3, same problem)

·  visualStudioVersion 11 (i try: VS 9 and  VS 10,  same problem) 

·  PythonTools for Visual Studio (PTVS)

·  Boost 1.55 (i try: 1.45,  same problem)

·  gccxml 0.9

·  pyplusplus 1.0 svn 1.5.1

·  pygccxml 1.0 svn 1.5.1

 

 

 

What is my mistake?

I would be very grateful if someone could an expert help.

Thanks for your response.

 

    Peter Armold

 

 

 

 

 

 

 


_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
https://mail.python.org/mailman/listinfo/cplusplus-sig